關鍵是你需要在視圖中正確渲染你的集合。首先,一個布爾屬性添加到角色視圖的數據對象,所以我們有一些我們的複選框綁定到:
public class Role
{
public bool IsInRole { get; set; }
[HiddenInput(DisplayValue = false)]
public int RoleId { get; set; }
[HiddenInput(DisplayValue = true)]
public string RoleName { get; set; }
}
通知我把一些HiddenInput屬性的屬性(稍後更多)。你也可以將你的User對象如上所示傳遞給視圖 - 這已經有了角色的子集合。有幾種方法可以使這個集合中的觀點,但一個最簡單的是:
<%: Html.EditorFor(m => m.Roles) %>
現在添加編輯模板的作用對象,因此上面的行做我們想要的。將Role.ascx添加到/ Views/Shared/EditorTemplates文件夾。 Roles.ascx可以看起來像這樣:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcApplication5.Controllers.Role>" %>
<%: Html.EditorFor(m => m.IsInRole) %>
<%: Html.EditorFor(m => m.RoleId) %>
<%: Html.EditorFor(m => m.RoleName) %>
當你做你的HTML看起來像這樣的查看源代碼,您會看到:
<input class="check-box" id="Roles_0__IsInRole" name="Roles[0].IsInRole" type="checkbox" value="true" /><input name="Roles[0].IsInRole" type="hidden" value="false" />
<input id="Roles_0__RoleId" name="Roles[0].RoleId" type="hidden" value="1" />
RoleName1<input id="Roles_0__RoleName" name="Roles[0].RoleName" type="hidden" value="RoleName1" />
<input class="check-box" id="Roles_1__IsInRole" name="Roles[1].IsInRole" type="checkbox" value="true" /><input name="Roles[1].IsInRole" type="hidden" value="false" />
<input id="Roles_1__RoleId" name="Roles[1].RoleId" type="hidden" value="2" />
RoleName2<input id="Roles_1__RoleName" name="Roles[1].RoleName" type="hidden" value="RoleName2" />
這是模式鍵綁定,當您的窗體被回發。我們使用DisplayValue = true作爲顯示名稱,因爲我們需要用於回發模型綁定的隱藏輸入,但它需要是隻讀的。對於roleId,這是一個隱藏的輸入,沒有值顯示給用戶。有關HiddenInput的更多信息,請參閱this post。
當你回過頭來,MVC內置模型聯編程序將確保你的角色集合是構造屬性,你會看到在你的模型中正確反映的複選框狀態。
您的Roles.ascx只接受Role,'<%:Html.EditorFor(m => m.Roles)%>'是一個列表。如果我讓Roles.ascx獲取一個列表,我必須遍歷它,然後它不包含視圖源中數組的索引。 – 2010-10-15 23:46:42
其實,這就是它的美。內置的<%:Html.EditorFor(m => m.Roles)%>足夠聰明,可以識別它正在傳遞一個集合。然後它會看到Roles.ascx編輯器模板,並將其用於集合中的每個項目。實際上,EditorFor()模板正在爲您執行循環。有用。我昨天晚上實現了你的例子,我發佈的所有代碼都來自工作位。給它一個鏡頭,你會看到它的作品,因爲你需要。 – 2010-10-16 01:41:18