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

tal*_*aul 1 c# asp.net-mvc razor asp.net-mvc-5

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

视图

@model myModel[]
<ul>
    @for (int i = 0; i < Model.Length; i++)
    {
        using (Html.BeginForm("controllerAction", "Controller", FormMethod.Post,
                               new { id="Form"+i }))
        {
            <li>
                @Html.TextBoxFor(a => a[i].property1)
                @Html.CheckBoxFor(a => a[i].property2)
                @Html.HiddenFor(a => a[i].property3)
                <input type="submit" />
            </li>
        }
    }
</ul>
Run Code Online (Sandbox Code Playgroud)

调节器

[HttpPost]
public ActionResult controllerAction(myModel[] models)
{
    ...do stuff...
}
Run Code Online (Sandbox Code Playgroud)

小智 6

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

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

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

<li>
    @Html.TextBoxFor(a => a[i].property1)
    @Html.CheckBoxFor(a => a[i].property2)
    @Html.HiddenFor(a => a[i].property3)
    <input type="hidden" name="Index" value="@i" /> // add this
    <input type="submit" />
</li>
Run Code Online (Sandbox Code Playgroud)