我环顾四周并找到了一些贴心的答案,但我还没有看到一个像这样的人:
使用实体框架我有以下内容:
角色模型:
public class Role
{
[Key]
public short RoleId { get; set; }
public string RoleName { get; set; }
public string RoleDescription { get; set; }
}
用户模型:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Username { get; set; }
//more fields etc...
public virtual ICollection<UserRole> UserRoles { get; set; }
}
和UserRole模型:
public class UserRole
{
[Key]
public int UserRoleId { get; set; }
public int UserId { get; set; }
public short RoleId { get; set; }
public virtual Role Role { get; set; }
}
我要做的是确定如何编写视图模型,以便在编辑用户时创建新用户和可用+所选角色列表时显示所有可用角色的列表。我可以使用foreach实现第一部分,但我觉得它很脏。
在我看到的所有示例中,整个viewmodel都包装在主视图上的IEnumerable中,并使用带有编辑器模板的@ Html.EditorForModel()进行渲染。这似乎允许将视图数据自动映射回底层模型。我想用相同的技术实现这一点,但我似乎无法在单一用户模型中处理Role / UserRole的集合。
我引用的StackOverflow问题:Generate Dynamically Checkboxes, And Select Some of them as Checked
答案 0 :(得分:2)
我建议使用2个视图模型进行编辑
public class RoleVM
{
public short RoleId { get; set; }
public string RoleName { get; set; }
public bool IsSelected { get; set; }
}
public class UserVM
{
public int Id { get; set; }
public string Name { get; set; }
public List<RoleVM> Roles { get; set; }
}
GET方法
public ActionResult Edit(int ID)
{
UserVM model = new UserVM();
// map all avaliable roles to model.Roles
// map user to model, including setting the IsSelected property for the users current roles
return View(model);
}
查看
@model YourAssembly.UserVM
...
@Html.TextBoxFor(m => m.Name)
...
@EditorFor(m => m.Roles)
EditorTemplate(RoleVM.cshtml)
@model YourAssemby.RoleVM
@Html.HiddenFor(m => m.RoleId) // for binding
@Html.CheckBoxFor(m => m.IsSelected) // for binding
@Html.DisplayFor(m => Name)
POST方法
[HttpPost]
public ActionResult Edit(UserVM model)
{
// model.Roles now contains the ID of all roles and a value indicating if its been selected