将ICollection绑定到MVC asp .NET中的编辑表单

时间:2015-07-22 11:42:27

标签: asp.net asp.net-mvc

我有两个模型:StudentCourse。我想创建一个编辑课程信息的简单表单,例如课程名称,并在课程中添加或删除学生。为此,Course模型具有属性public virtual ICollection<Student> Students { get; set; }。我创建这样的表单:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Create Course</h4>
        <hr />
        @Html.ValidationSummary(true)
        @Html.HiddenFor(model => model.Id)

        <div class="form-group">
            @Html.LabelFor(model => model.CourseName, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.CourseName)
                @Html.ValidationMessageFor(model => model.CourseName)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Time, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Time)
                @Html.ValidationMessageFor(model => model.Time)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Students, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.ListBoxFor(model => model.Students, (IEnumerable<SelectListItem>)ViewBag.Students)
                @Html.ValidationMessageFor(model => model.Students)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

该表单可以毫无问题地将所有学生提取到列表中。当我点击保存按钮并开始调试我的应用程序时,课程,名称和时间的详细信息将成功传递到服务器,但所选的学生不会。不仅如此,当我加载表单时,如果课程中有一些学生,则不会在列表中选择这些学生。所以有人能告诉我,我犯的错误是什么?

1 个答案:

答案 0 :(得分:1)

您需要在List<int>模型中创建Course。所以,它可以映射到它。列表框中的选定值将返回List<int>而不是List<Student>。因此,如果您无法编辑现有模型,则需要为此创建ViewModel

以下是示例课程模型或视图模型。

public class Course
    {
        public int Id { get; set; }
        public string CourseName { get; set; }
        public string Time { get; set; }
        public List<int> Students { get; set; }
    }