Я бы начал с разработки модели представления для этого сценария:
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>