一个MVC表单上的多个表单,使用循环创建,只有第一个提交数据

我有以下代码,只有第一个表单提交任何内容,以下提交null值,每个模型都有数据。 如果我将其更改为一个大表单,则所有内容都会提交。 为什么其他个人forms会发布空值?

视图

@model myModel[] 
    @for (int i = 0; i < Model.Length; i++) { using (Html.BeginForm("controllerAction", "Controller", FormMethod.Post, new { id="Form"+i })) {
  • @Html.TextBoxFor(a => a[i].property1) @Html.CheckBoxFor(a => a[i].property2) @Html.HiddenFor(a => a[i].property3)
  • } }

调节器

 [HttpPost] public ActionResult controllerAction(myModel[] models) { ...do stuff... } 

原因是您的for循环中的索引器创建表单控件,而您的POST方法参数是myModel[] models

默认情况下, DefaultModelBinder要求集合为零和连续,因此如果您尝试提交第二个表单,则返回[1].property1: someValue等。因为索引器从1开始,绑定失败并且模型为null

您可以通过为模型绑定器使用的Index属性添加隐藏输入来匹配非连续索引器来解决此问题

 
  • @Html.TextBoxFor(a => a[i].property1) @Html.CheckBoxFor(a => a[i].property2) @Html.HiddenFor(a => a[i].property3) // add this