您的问题归结为一个用例,您希望在视图模型中发布一组子项,其中子项表示 UI 中的复选框。
为您的视图创建一个视图模型,您将在其中创建用户并同时分配角色。
public class AddUserRoleVM
{
public string UserName { set; get; }
public List<UserRoleVM> Roles { set; get; }
public AddUserRoleVM()
{
Roles=new List<UserRoleVM>();
}
}
public class UserRoleVM
{
public int RoleId { set; get; }
public String RoleName { set; get; }
public bool IsSelected { set; get; }
}
现在在您的 GET 操作中,创建 AddUserRoleVM 视图模型的对象,初始化 Roles 集合属性并将其发送到视图。
public ActionResult Roles()
{
var vm = new AddUserRoleVM();
vm.Roles = GetRoles();
return View(vm);
}
private List<UserRoleVM> GetRoles()
{
//Hard coded for demo.You should get the roles from db
return new List<UserRoleVM>
{
new UserRoleVM {RoleId = 1, RoleName = "Admin"},
new UserRoleVM {RoleId = 2, RoleName = "Editor"}
};
}
现在在Views/YourControllerName 下创建一个名为EditorTemplates 的文件夹。然后在 UserRoleVM.cshtml 下创建一个新视图,内容如下。
@model ReplaceYourNamespaceHere.UserRoleVM
<div>
@Html.HiddenFor(s=>s.RoleId)
<label>@Model.RoleName</label>
@Html.CheckBoxFor(s=>s.IsSelected)
</div>
现在在我们的主视图(Roles.cshtml)中,使用Html.EditorFor HTML helper 方法来带来这个视图。
@model YourNameSpaceHere.AddUserRoleVM
<h2>Create User</h2>
@using (Html.BeginForm())
{
<label>UserName : </label> @Html.TextBoxFor(s=>s.UserName)
<label>Roles:</label>
@Html.EditorFor(s=>s.Roles)
<input type="submit"/>
}
现在,当您发布表单数据时,检查您发布的模型的 Roles 集合并验证每个项目的 IsSelected 属性。
干杯!