关键是您需要在视图中正确呈现您的集合。首先,向角色视图数据对象添加一个布尔属性,以便我们可以将复选框绑定到:
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,这是一个隐藏输入,不会向用户显示任何值。看这个帖子有关隐藏输入的更多信息。
当您将其发回时,MVC 内置模型绑定器将确保您的角色集合是构造属性,并且您将看到复选框状态正确反映在模型中。