1

を取り込むビューがIEnumerable<User>あり、すべてのユーザーに対して、ページの下部に保存ボタンがあるエディターを送り出します。私の投稿アクションは を受け取りますIEnumerable<User>が、何らかの理由でこの値は常に null です。

これが私の見解です(短縮)

@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 メソッドが機能することはわかっています。「ユーザー」がnullであるため、ループでエラーがスローされます。

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 に答える