VB.net - 在控制器中的collection = null模型上使用编辑器模板

时间:2016-05-18 16:45:25

标签: asp.net asp.net-mvc vb.net razor

这是我的班级

Public Class ManageStudents
    Public Students As New List(Of ManageStudentLine)
End Class

我有一个调用我的editortemplate的视图

@ModelType ViewModel.ManageStudents

@Html.EditorFor(Model.Students)

这是我的编辑模板

@ModelType ViewModel.ManageStudentLine

@Using Html.BeginForm()
    @Html.TextBoxFor(Function(x) x.StudentNumber)
    <Button type="submit"/>
end using

所以我要做的是让EditorFor()遍历ManageStudentLines的集合,并为每个ManageStudentLine生成一个单独的表单。提交表单时出现问题,模型返回为空。

我尝试在主视图中使用foreach来迭代集合,只需在单个对象上调用EditorFor(),但这不起作用。

我也尝试在编辑器模板之外移动表单标签,但这不起作用。

我最初将所有内容都移到EditorTemplate,因为我遇到了客户端数据验证无法解决的问题。 EditorTemplate修复了这个问题,但我的模型是空的。

当然,我不是第一个想要迭代一个集合的人,并且每个对象都是一个带有工作验证的单独表单。

1 个答案:

答案 0 :(得分:1)

您的EditorFor()方法为带有索引器的集合正确生成表单控件,而您生成的html是

<input type="text" name="Students[0].StudentNumber" ... />
<input type="text" name="Students[1].StudentNumber" ... />

这意味着您需要将整个集合(以单一形式)发回给具有参数List(Of ManageStudentLine) model的方法。

拥有多个表单对于集合没有意义,因为您一次只能提交一个表单,这意味着如果有任何验证错误,您将永远不会返回该表单。

将您的观点更改为

@ModelType ViewModel.ManageStudents

@Using Html.BeginForm()
    @Html.EditorFor(Model.Students)
    <button type="submit"/>
end using

EditorTemplate

@ModelType ViewModel.ManageStudentLine
@Html.TextBoxFor(Function(x) x.StudentNumber)

允许您编辑集合中的所有项目并正确回发集合。

请注意,如果您确实要为每个项目生成一个表单,则无法使用HtmlHelper方法,并且您需要手动生成html为

<input type="text" name="StudentNumber" ... />

您将失去模型绑定,验证等所有好处。