2012-07-17 2 views
4

MVC에서 매우 새롭기 때문에 저에게 곰이 필요하지만 SelectList의 값을 포스트 백 동안 선택한 객체의 인스턴스에 바인딩 할 수 없습니다. MVC 4.드롭 다운 목록에서 MVC 4의 모델 객체에 SelectedItem 바인딩

학교의 구성원으로서 교사를 만들어야한다고 가정 해 보겠습니다. I는 뷰 모델 클래스는 다음과 같은 정의 :

public class RegisterTeacherModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email address")] 
    public string Email { get; set; } 

    [Required] 
    [Display(Name = "School")] 
    public School SelectedSchool { get; set; } 

    [ScaffoldColumn(false)] 
    public Guid UserId 
    { 
     get; 
     set; 
    } 

    public SelectList PossibleSchools 
    { 
     get; 
     private set; 
    } 

    public RegisterTeacherModel(IRepository<School> schoolRepo) 
    { 
     PossibleSchools = new SelectList(schoolRepo, "Id", "Name"); 
    } 
} 

그리고 내보기 :

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>RegisterTeacherModel</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.UserName) 
    </div> 

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

    <div class="editor-label"> 
     @Html.LabelFor(model => model.SelectedSchool) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.SelectedSchool, Model.PossibleSchools) 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

그리고 마지막으로, 내 컨트롤러 방법 :

[HttpPost, ActionName("Create")] 
    public ActionResult CreateTeacher(RegisterTeacherModel teacherModel) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       ... 
      } 
     } 
    } 

하지만 뒤쪽에 RegisterTeacherModel 개체를받을 때 컨트롤러에서 내 Create 메서드, SelectedSchool 항상 null입니다. 모델 바인더가 포스트 백에서 객체 참조를 다시 만드는 방식으로 뭔가를 놓치고 있어야합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

+0

작성 페이지에서 소스를 보는 경우 드롭 다운 목록의 ID는 무엇입니까? 그리고 가치는 무엇입니까? – Jonathan

답변

2

글쎄, 나는 해결책을 찾았습니다. 내가 뭔가를 누락하면 나는 아직도 모르겠지만, 대신 내 뷰 모델에 학교 객체를 사용하여, 나는 같은 SelectedSchoolId로 대체 :

public class RegisterTeacherModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email address")] 
    public string Email { get; set; } 

    [Required] 
    [Display(Name = "School")] 
    public int SelectedSchoolId { get; set; } 

    ... 
} 

그리고 대신를 사용하여 내보기 드롭 다운을 변경 :

<div class="editor-field"> 
    @Html.DropDownListFor(model => model.SelectedSchoolId, Model.PossibleSchools) 
</div> 

그리고 실제 모델 객체를 생성 할 때 내 컨트롤러에, 나는 단순히 학교 저장소에서 학교 객체를 뽑을 수와 실제 교사 객체와 연결

.

3

두 번째 게시물에서이 코드를 만져 보았습니다. Model.SelectedSchool에 초기 코드를 지정해보십시오. <IdProperty>

<div class="editor-field"> 
    @Html.DropDownListFor(model => model.SelectedSchool.**<IdProperty>**, Model.PossibleSchools) 
</div> 
+0

이 답변은 다음과 같습니다. 나는 POCO (즉, OP의 예에서 School)를 사용하기를 원했고, 다른 답에서 주어진 id 필드에 대한 참조가 아니라,이 답은 내가 찾고있는 것을 정확하게 주었다. 고마워, TSmith. – BruceHill

+0

MVC3에서 이것을 시도했지만 선택한 값을 얻을 수 없습니다. 정말로 저를 깜박입니다. 마침내 MVC4에서 수정 되었습니까? + – nportelli

관련 문제