这是我的班级
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
修复了这个问题,但我的模型是空的。
当然,我不是第一个想要迭代一个集合的人,并且每个对象都是一个带有工作验证的单独表单。
答案 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" ... />
您将失去模型绑定,验证等所有好处。