1

我有一个视图,它IEnumerable<User>为每个用户提供一个编辑器,在页面底部有一个保存按钮。我的 post 操作采用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 方法可以正常工作,因为它可以很好地处理单个实体。它会在循环中引发错误,因为“用户”为空。

4

1 回答 1

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 => m[i].IsAdmin) 代码使名称成为 MVC 模型绑定器期望的正确名称。

于 2012-05-04T21:02:11.257 回答