ASP.NET MVC在客户端有很多很多模型

时间:2010-10-14 22:13:03

标签: asp.net-mvc

我有3多个表:Users -< UserRoles >- Roles。我设置了这样的模型:

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

编辑/创建用户时,如何获取控制器中角色的选中复选框以及如何在我的视图中进行设置?

如果我在设置模型的过程中从一开始就错了,请告诉我并协助我如何做到这一点。

感谢。

2 个答案:

答案 0 :(得分:1)

关键是你需要在视图中正确渲染你的集合。首先,向Role视图数据对象添加一个Boolean属性,这样我们就可以将复选框绑定到:

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对象传递给视图 - 这已经有了Roles的子集合。有几种方法可以在视图中呈现此集合,但最简单的方法之一是:

<%: Html.EditorFor(m => m.Roles) %>

现在为Role对象添加一个编辑器模板,以便上面的行完成我们想要的操作。将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内置模型绑定器将确保您的角色集合是构造属性,并且您将看到模型中正确反映的复选框状态。

答案 1 :(得分:0)

您可以构建自定义模型绑定器。请阅读here以获取示例。