【问题标题】:VB.net - Using an Editor Template on a collection = null model in controllerVB.net - 在集合上使用编辑器模板 = 控制器中的空模型
【发布时间】:2016-09-15 07:05:21
【问题描述】:

这是我的课

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

我有一个视图调用我的编辑器模板

@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 已经解决了这个问题,但我的模型是空的。

当然,我不是第一个想要迭代集合并让每个对象成为具有有效验证的单独表单的人。

【问题讨论】:

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


    【解决方案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" ... />
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多