2012-05-04 39 views
1

保存多個實體我有一個觀點,即需要在IEnumerable<User>併爲每一位用戶就泵出在頁面底部有一個保存按鈕編輯器。我的帖子操作採用IEnumerable<User>,但由於某些原因,此值始終爲空。使用ASP.NET MVC3

這是我的看法(縮短)

@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"); 
     } 

我知道保存方法的工作,因爲它與單一實體就好作品。它會在循環中拋出錯誤,因爲'users'爲空。

+0

模型綁定不知道您發送它,因爲你是如何使用的編輯器和顯示HTML輔助的集合。 –

回答

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模型綁定器預期的正確名稱。

+0

但是後來我失去了通過用戶名識別用戶的能力,所以使用這個系統的人不知道他們正在編輯誰。 – Johannes

+0

爲什麼?個人用戶名仍將顯示。 –