我有以下代码,只有第一个表单提交任何内容,以下提交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>
控制器
[HttpPost]
public ActionResult controllerAction(myModel[] models)
{
...do stuff...
}
答案 0 :(得分: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>