So I have a Collection of User objects, which should be mass-editable (edit many users at the same time). I'm saving the user input to the database using Entity Framework.
The collection the controller method gets from the form is null. Why? Also, is the BindAttribute possible to use with collections like in my code?
@model IEnumerable<Domain.User>
@using (Html.BeginForm("UpdateUsers", "Users"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
foreach (var item in Model)
{
@Html.HiddenFor(modelItem => item.Id)
@Html.EditorFor(modelItem => item.FirstName)
@Html.ValidationMessageFor(model => item.FirstName)
@Html.EditorFor(modelItem => item.LastName)
@Html.ValidationMessageFor(model => item.LastName)
@Html.EditorFor(modelItem => item.Birth)
@Html.ValidationMessageFor(model => item.Birth)
}
<input type="submit" value="Update user data"/>
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateUsers([Bind(Include = "Id,FirstName,LastName,Birth")] IEnumerable<User> users)
{
if (ModelState.IsValid)
{
foreach (User u in users)
{
db.Entry(u).State = EntityState.Modified;
}
db.SaveChanges();
}
return RedirectToAction("EditUsers");
}
You need to index your collection with a for
rather than a foreach
in order for the ModelBinder to pick it up:
for (var i = 0 ; i < Model.Count(); i++)
{
@Html.HiddenFor(modelItem => modelItem[i].Id)
@Html.EditorFor(modelItem => modelItem[i].FirstName)
@Html.ValidationMessageFor(modelItem => modelItem[i].FirstName)
@Html.EditorFor(modelItem => modelItem[i].LastName)
@Html.ValidationMessageFor(modelItem => modelItem[i].LastName)
@Html.EditorFor(modelItem => modelItem[i].Birth)
@Html.ValidationMessageFor(modelItem => modelItem[i].Birth)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With