使用ASP.NET MVC3保存多个实体

时间:2012-05-04 20:55:54

标签: c# asp.net-mvc-3

我有一个视图,它接收IEnumerable<User>,并为每个用户提供一个编辑器,页面底部有一个保存按钮。我的帖子操作采用IEnumerable<User>但由于某种原因,此值始终为空。

这是我的观点(缩短)

@model IEnumerable<User>
    @using (Html.BeginForm("ViewUsers", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        foreach (var item in Model) {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Username)
                </td>
                <td>
                    @Html.EditorFor(modelItem => item.IsAdmin)
                </td>
                <td>
                    @Html.EditorFor(modelItem => item.GoldCoins)
                </td>
            </tr>
        }
        <tr><td><input type="submit" value="Save"/></td></tr>
    }

我的行动:

 public ActionResult ViewUsers()
        {
            IEnumerable<User> users = userService.GetUsers();
            return View(users.ToList());
        }

        [HttpPost]
        public ActionResult ViewUsers(List<User> users)
        {
                foreach (User u in users)
                {
                    userService.Save(u);
                }
            return RedirectToAction("ViewUsers");
        }

我知道save方法可以正常工作,因为它可以很好地处理单个实体。它会在循环中抛出错误,因为'users'为空。

1 个答案:

答案 0 :(得分:0)

您需要使用编辑器HTML帮助程序,例如:

@model List<User>
@using (Html.BeginForm("ViewUsers", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @for (int i = 0; i < Model.Count; i++) {
       @Html.DisplayFor(m => m[i].Username)
       @:Is Admin: @Html.EditorFor(m => m[i].IsAdmin)
       @:Gold Coins: @Html.EditorFor(m => m[i].GoldCoins)
    }
    <input type="submit" value="Save"/>
}

注意:我剥离了表格标签,使其更易于阅读。要点是,绑定到集合需要在表单中提交的名称/值的名称部分返回到服务器以遵循特定约定。 EditorFor(m =&gt; m [i] .IsAdmin)代码使名称成为MVC模型绑定器所期望的正确名称。