【问题标题】:Partial View List returns null when saving the model保存模型时,部分视图列表返回 null
【发布时间】:2016-08-28 18:15:54
【问题描述】:

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

  • 不要关注对象,我写了假的例子。

这是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>

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

【问题讨论】:

  • 你不能使用partial来为复杂对象生成控件,除非你传递HtmlFieldPrefix(参考this answer),但是正确的方法是使用EditorTemplate for typeof Students (以this answer为例)
  • 并注意复选框本身不会发布任何有意义的内容 - 您需要输入 Students 对象的 ID 属性

标签: c# asp.net-mvc partial-views


【解决方案1】:

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

假设您的StudentVM 有一个Students 类型为IEnumerable&lt;Students&gt; 的集合

如果您的 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>

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

【讨论】:

  • 我忘了写主要内容 - 我更新了我的帖子。我实际上在每个学生附近都有一个复选框,我想获取所有选定的学生,但它返回 null。例如:如果我选择 1 个学生,那么我将在我的列表中看到:姓名:“学生姓名”,IsSelected:true。并且所有其他学生都将是 IsSelected: false。
  • @Shyju 为什么不使用 for 循环而不是计数器?
【解决方案2】:

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

ViewModels.StudentVM != IEnumerable<Entities.Students>

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

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

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多