ASP.NET MVC客户端多对多模型

问题描述:

我有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;} 
} 

当编辑/创建用户,我怎么去获得所扮演的角色选中的复选框中的控制器,我怎么会在我看来设置呢?

如果我从一开始就设置我的模型,请告诉我并协助我如何去做这件事。

谢谢。

关键是你需要在视图中正确渲染你的集合。首先,一个布尔属性添加到角色视图的数据对象,所以我们有一些我们的复选框绑定到:

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,' m.Roles)%>'是一个列表。如果我让Roles.ascx获取一个列表,我必须遍历它,然后它不包含视图源中数组的索引。 – 2010-10-15 23:46:42

+1

其实,这就是它的美。内置的 m.Roles)%>足够聪明,可以识别它正在传递一个集合。然后它会看到Roles.ascx编辑器模板,并将其用于集合中的每个项目。实际上,EditorFor()模板正在为您执行循环。有用。我昨天晚上实现了你的例子,我发布的所有代码都来自工作位。给它一个镜头,你会看到它的作品,因为你需要。 – 2010-10-16 01:41:18

您可以构建自定义模型联编程序。以here为例。

+0

我会如何将“AllRoles”放在视图上作为复选框,然后在返回时将它们放入模型中? – 2010-10-14 22:56:03