Reputation: 1513
I have the following code, only the first form submits anything, the following submit null values, each model has data. If I change it to just one large form, everything submits. Why do the other individual forms post null values?
View
@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>
Controller
[HttpPost]
public ActionResult controllerAction(myModel[] models)
{
...do stuff...
}
Upvotes: 4
Views: 3253
Reputation:
The reason is that your creating form controls with indexers in your for
loop, and your POST method parameter is myModel[] models
.
By default, the DefaultModelBinder
requires collection to be zero based and consecutive, so if you attempt to submit the second form, your posting back [1].property1: someValue
etc. Because the indexer starts at 1, binding fails and the model is null
.
You can solve this by adding a hidden input for an Index
property used by the model binder to match up non consecutive indexers
<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>
Upvotes: 8