在asp.net mvc视图和控制器中有很多很多

时间:2011-01-10 19:41:56

标签: asp.net-mvc many-to-many asp.net-mvc-3 poco

如何在usersroles的上下文中处理视图和控制器中的多对多对象映射?

我使用实体框架映射到这样的纯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 个答案:

答案 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>