Много ко многим в asp.net mvc view и контроллере - PullRequest
6 голосов
/ 10 января 2011

Как мне обрабатывать сопоставление объектов «многие ко многим» в представлении и контроллере в контексте 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; }
}

На мой взгляд, я бы хотел добавить пользователя в роль с помощью флажков. Я перечисляю все роли и отмечаю одну, чтобы добавить пользователя в эту роль. Как мне справиться с этим?

1 Ответ

15 голосов
/ 10 января 2011

Я бы начал с разработки модели представления для этого сценария:

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>
...