2012-07-17 38 views
4

我很新的MVC,所以忍受我,但我似乎无法绑定一个选择列表中的值到选定对象的实例在回发期间MVC 4.从Dropdownlist绑定SelectedItem到模型对象在MVC 4

假设我必须创建一位教师作为学校的成员。我有一个ViewModel类定义为这样:

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始终为空。我必须以模型绑定器在回发中重新创建对象引用的方式丢失一些东西。任何人都可以将我指向正确的方向吗?

+0

如果您在创建页面上查看源代码,那么下拉列表的ID是什么?什么是价值? – Jonathan 2012-07-18 19:05:02

回答

2

嗯,我找到了解决方法。我仍然不知道如果我失去了一些东西,但不是在我的ViewModel使用学校的对象,我与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 2013-01-06 19:18:10

+0

我试过这个在MVC3中,我不能得到任何选定的值。真的让我失望。这最终是否修复在MVC4? + – nportelli 2013-01-30 21:56:21