2010-10-14 163 views
3

我有3多個表:Users -<UserRoles>- Roles。設置我的模式是這樣的:ASP.NET MVC客戶端多對多模型

public class User 
{ 
    public int UserId {get; set;}; 
    public IEnumerable<Role> Roles {get; set;}; 
} 

public class Role 
{ 
    public int RoleId {get; set;}; 
    public string RoleName {get; set}; 
} 

public class UserDisplayModel 
{ 
    public User User{get; set;}; 
    public IEnumerable<Role> AllRoles {get; set;} 
} 

當編輯/創建用戶,我怎麼去獲得所扮演的角色選中的複選框中的控制器,我怎麼會在我看來設置呢?

如果我從一開始就設置我的模型,請告訴我並協助我如何去做這件事。

謝謝。

回答

1

關鍵是你需要在視圖中正確渲染你的集合。首先,一個布爾屬性添加到角色視圖的數據對象,所以我們有一些我們的複選框綁定到:

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內置模型聯編程序將確保你的角色集合是構造屬性,你會看到在你的模型中正確反映的複選框狀態。

+0

您的Roles.ascx只接受Role,'<%:Html.EditorFor(m => m.Roles)%>'是一個列表。如果我讓Roles.ascx獲取一個列表,我必須遍歷它,然後它不包含視圖源中數組的索引。 – 2010-10-15 23:46:42

+1

其實,這就是它的美。內置的<%:Html.EditorFor(m => m.Roles)%>足夠聰明,可以識別它正在傳遞一個集合。然後它會看到Roles.ascx編輯器模板,並將其用於集合中的每個項目。實際上,EditorFor()模板正在爲您執行循環。有用。我昨天晚上實現了你的例子,我發佈的所有代碼都來自工作位。給它一個鏡頭,你會看到它的作品,因爲你需要。 – 2010-10-16 01:41:18

0

您可以構建自定義模型聯編程序。以here爲例。

+0

我會如何將「AllRoles」放在視圖上作爲複選框,然後在返回時將它們放入模型中? – 2010-10-14 22:56:03