部分视图列表 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();
我将一个列表传递给局部视图并且它工作正常,它显示所有数据但是当我保存模型时,列表 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();