Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC5: Want to update several items in Collection with model binding

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?

View:

@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"/>
}

Controller:

[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");
}
like image 965
Andrew Avatar asked Sep 18 '14 14:09

Andrew


1 Answers

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)
    }
like image 66
hutchonoid Avatar answered Oct 29 '22 22:10

hutchonoid