我将List传递给局部视图并且工作正常,它显示所有数据,但是当我保存模型时,List返回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名学生。 然后单击“保存”按钮。结果:尽管我选择了3名学生,但Model.Students为null。我怎样才能得到这些学生?
答案 0 :(得分:1)
您当前的部分视图代码只有调用DisplayNameFor
帮助程序方法,该方法仅将显示名称呈现为标签。如果要提交每个项目的数据,则需要生成与视图模型属性结构匹配的输入表单字段。
假设您的StudentVM
有一个Students
类型IEnumerable<Students>
如果您的HttpPost操作方法的参数属于StudentVm
类型,则需要确保您的局部视图生成输入表单字段,其名称类似于&#39; 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
方法。
答案 1 :(得分:0)
也许您在视图中使用了2种不同的模型...... 你可以在1个viewmodel中使用2个模型 这不是局部视图
pub fn play() {
let mut game = Game::new();
loop {
match game.turn() {
Ok(()) => { game.turn += 1 }
Err(e) => println!("{}", e)
}
}
}
您可以在1个视图模型中传递所有数据(许多模型) :
ViewModels.StudentVM != IEnumerable<Entities.Students>