部分视图列表 returns 保存模型时为空

Partial View List returns null when saving the model

我将一个列表传递给局部视图并且它工作正常,它显示所有数据但是当我保存模型时,列表 returns 为空,我错过了什么?

这是 cshtml:

@model ViewModels.StudentVM

@using (Html.BeginForm("SaveStudent", "StudentsView", FormMethod.Post}))
{
    @Html.AntiForgeryToken();
    <div class="row">
        <span>Student name:</span>
        @Html.TextBoxFor(s => s.Name)
    </div>
    <div>
        @Html.Partial("StudentsList", Model.Students)
    </div>
    <div class="form-group">
        <input type="submit" value="Save" class="btn">
    </div>
}

加载视图时,我将所有学生带到视图模型:

vm.Students = await _studentController.GetAllStudents(); // returned 20 Students.

局部视图:

@model IEnumerable<Entities.Students>

<table class="table-bordered">
    @foreach (var item in Model)
    {
        <tr>
            <td>
               @Html.CheckBoxFor(modelItem => item.IsSelected)
            </td>
            <td>
               @Html.DisplayFor(modelItem => item.Name)
            </td>
        </tr>
    }
</table>

我想要所有 select 的学生,所以假设我会 select 3 名学生。 然后点击保存按钮。结果:Model.Students 为空,尽管我 select 教育了 3 个学生。我怎样才能得到那些学生?

您当前的局部视图代码只有调用 DisplayNameFor 辅助方法,该方法只会将显示名称呈现为标签。如果要提交每个项目的数据,则需要生成名称与您的视图模型匹配的输入表单字段 属性 结构。

假设您的 StudentVM 有一个 Students 类型的集合 IEnumerable<Students>

如果您的 HttpPost 操作方法的参数类型为 StudentVm,您需要确保您的局部视图正在生成名称为 'Students[0].Name, 'Students[1].Name 的输入表单字段等。您可以使用 Html.TextBox 辅助方法并指定此自定义名称

@model IEnumerable<Students>
<table class="table-bordered">
    @{
        var counter = 0;
    }
    @foreach (var student in Model)
    {
        <tr>
            <th>Name</th>
            <td>@Html.TextBox("Students[" + counter + "].Name", student.Name)</td>
        </tr>
        counter++;
    }
</table>

如果只是显示现有学生的姓名,则不需要文本字段,只需在循环中显示即可。在那种情况下,当表单提交时,你为什么担心 Students 集合是 null ?您正在尝试保存将在 .Name 属性 中的新学生。因此,如果您再次需要现有学生(但为什么?),您可以调用 GetAllStudents 方法。

也许你在视图中使用了 2 个不同的模型...... 您可以在 1 个视图模型中使用 2 个模型 不需要局部视图

ViewModels.StudentVM != IEnumerable<Entities.Students>

您可以在 1 个视图模型中传递所有数据(许多模型) :

var vm = new TestViewModel();
vm.one = db.one.tolist();
vm.two = db.two.tolist();