如何在users
和roles
的上下文中处理视图和控制器中的多对多对象映射?
我使用实体框架映射到这样的纯POCO:
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
public List<User> Users { get; set; }
}
public class User
{
public int UserId { get; set; }
public List<Role> Roles { get; set; }
}
在我看来,我想使用复选框将用户添加到角色。我列出了所有角色,然后选中一个以将用户添加到该角色。我该如何处理?
答案 0 :(得分:15)
我首先要为这种情况设计一个视图模型:
public class UserRolesViewModel
{
public int UserId { get; set; }
public IEnumerable<RoleViewModel> Roles { get; set; }
}
public class RoleViewModel
{
public int RoleId { get; set; }
public bool InRole { get; set; }
public string RoleName { get; set; }
}
然后是角色控制器:
public class RolesController : Controller
{
public ActionResult Edit(int userId)
{
// TODO: Use a repository to fetch the roles associated to the given
// user id and then AutoMapper to map your model POCOs
// to a UserRolesViewModel
var model = new UserRolesViewModel
{
UserId = userId,
Roles = new[]
{
new RoleViewModel { RoleId = 1, InRole = false, RoleName = "Role 1" },
new RoleViewModel { RoleId = 2, InRole = true, RoleName = "Role 2" },
new RoleViewModel { RoleId = 3, InRole = true, RoleName = "Role 3" }
}
};
return View(model);
}
[HttpPut]
public ActionResult Update(UserRolesViewModel model)
{
// Here you will get the view model back containing the
// user id and the selected roles
// TODO: use AutoMapper to map back to a POCO and
// invoke the repository to update the database
return RedirectToAction("Edit");
}
}
然后是编辑视图(~/Views/Roles/Edit.cshtml
):
@model YourAppName.Models.UserRolesViewModel
@{
ViewBag.Title = "Edit user roles";
}
<h2>Roles for user @Model.UserId</h2>
@using (Html.BeginForm("Update", "Roles"))
{
@Html.HttpMethodOverride(HttpVerbs.Put)
@Html.HiddenFor(x => x.UserId)
@Html.EditorFor(x => x.Roles)
<input type="submit" value="update roles" />
}
最后是相应的编辑器模板(~/Views/Roles/EditorTemplates/RoleViewModel.cshtml
):
@model YourAppName.Models.RoleViewModel
<div>
@Model.RoleName
@Html.HiddenFor(x => x.RoleId)
@Html.CheckBoxFor(x => x.InRole)
</div>