2011-02-10 2 views
0

다음 코드에 문제가 있습니다. 기본적으로 내가 updatemodel을 호출하면 실패하지만 내부 예외가 발생하지 않습니다. 드롭 다운을 텍스트 상자로 변경하면 작동합니다.mvc3 면도기 드롭 다운 목록으로 인해 업데이트 모델이 실패 함

클래스 :

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; } 

} 

컨트롤러 방법 :

[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(); 
     } 
    } 

마지막 cshtml 코드 :

@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> 

나는 updatemodel 라인이 실패 저장 버튼을 클릭합니다. 위에서 말했듯이,성에 텍스트 상자를 사용하면 실패하지 않습니다. 누구든지 실패하게 만들거나 디버깅하는 방법을 알고 있습니까? null 허용 정수로 MemberID 속성을 선언

+1

또한 가장 좋은 방법은 당신이 전송되지 않아야 도메인 모델이보기에 직접 객체. 뷰가 표시/기능해야하는 데이터를 캡슐화하는 ViewModel 객체를 만들어야합니다. –

답변

0

시도 :

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