mvc3 razor dropdownlistfor causing update model to fail

2.3k views Asked by At

I have a problem with the following code. Basically when I call updatemodel it fails but I dont get an inner exception. If i change the drop down to a text box it works.

class:

public class Member
{
    [Key]
    public int MemberID { get; set; }
    [StringLength(50),Required()]
    public string Name { get; set; }
    [Range(0,120)]
    public short Age { get; set; }    
    [Required(),MaxLength(1)]
    public string Gender {get; set;}
    [Required()]
    public virtual Team Team { get; set; }

}

controller methods:

[HttpGet]
    public ActionResult ViewMember(int id)
    {
        try
        {
            var m = db.GetMember(id);
            var maleItem = new SelectListItem{Text = "Male", Value= "M", Selected=m.Gender == "M"};
            var femaleItem = new SelectListItem{Text = "Female", Value="F", Selected=m.Gender == "F"};
            List<SelectListItem> items = new List<SelectListItem>();
            items.Add(maleItem);
            items.Add(femaleItem);
            var genders = new SelectList(items, "Value", "Text");
            ViewBag.Genders = genders;

            return View(m);
        }
        catch (Exception ex)
        {
            return View();
        }
    }

    [HttpPost]
    public ActionResult ViewMember(Member m)
    {
        try
        {
            var member = db.GetMember(m.MemberID);
            m.Team = db.GetTeam(member.Team.TeamID);
            UpdateModel(member);
            db.Save();
            return RedirectToAction("ViewMembers", new { id = member.Team.TeamID });
        }
        catch (Exception ex)
        {
            return View();
        }
    }

and finally cshtml code:

@model GreenpowerAdmin.Models.Member
@using GreenpowerAdmin.Helpers

@{
ViewBag.Title = "ViewMember";
}

<h2>ViewMember</h2>

 <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">     </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Member</legend>

    @Html.HiddenFor(model => model.MemberID)

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Team.Name)
    </div>
    <div class="editor-field">
        @Html.DisplayFor(model => model.Team.Name)
        @Html.ValidationMessageFor(model => model.Team.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Age)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Age)
        @Html.ValidationMessageFor(model => model.Age)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Gender)
    </div>
    <div class="editor-field">
        @Html.DropDownList("Gender", ViewBag.Genders as SelectList)            
        @Html.ValidationMessageFor(model => model.Gender)
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "ViewMembers", new { id=Model.Team.TeamID })
</div>

When I click the save button the updatemodel line fails. As said above, it doesn't fail if I use a text box for gender. Does anyone know what is making it fail or how to debug it?

1

There are 1 answers

0
Darin Dimitrov On

Try declaring the MemberID property as a nullable integer:

[Key]
public int? MemberID { get; set; }