4

我对 MVC 很陌生,所以请耐心等待,但在 MVC 4 的回发期间,我似乎无法将 SelectList 中的值绑定到所选对象的实例。

假设我必须创建一个教师作为学校的成员。我有一个这样定义的 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>
}

最后,我的 Controller 方法:

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

但是,当我在 Controller 的 Create 方法中收到 RegisterTeacherModel 对象时,SelectedSchool 始终为空。我必须在模型绑定器在回发时重新创建对象引用的方式上遗漏了一些东西。谁能指出我正确的方向?

4

2 回答 2

3

我认为您在第二篇文章中提到了它:尝试将初始代码指向 Model.SelectedSchool。<IdProperty>

<div class="editor-field">
  @Html.DropDownListFor(model => model.SelectedSchool.**<IdProperty>**, Model.PossibleSchools)
</div>
于 2012-11-29T20:50:51.510 回答
2

好吧,我找到了解决方法。我仍然不知道我是否遗漏了什么,但我没有在 ViewModel 中使用 School 对象,而是将其替换为 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>

然后在我的控制器中,当创建真实的模型对象时,我可以简单地从 School 存储库中提取 School 对象并将其与真实的 Teacher 对象相关联。

于 2012-07-22T17:54:36.377 回答