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内置模型联编程序将确保你的角色集合是构造属性,你会看到在你的模型中正确反映的复选框状态。
您的Roles.ascx只接受Role,' m.Roles)%>'是一个列表。如果我让Roles.ascx获取一个列表,我必须遍历它,然后它不包含视图源中数组的索引。 – 2010-10-15 23:46:42
其实,这就是它的美。内置的 m.Roles)%>足够聪明,可以识别它正在传递一个集合。然后它会看到Roles.ascx编辑器模板,并将其用于集合中的每个项目。实际上,EditorFor()模板正在为您执行循环。有用。我昨天晚上实现了你的例子,我发布的所有代码都来自工作位。给它一个镜头,你会看到它的作品,因为你需要。 – 2010-10-16 01:41:18