2011-01-10 26 views
6

users ve roles bağlamında görünüm ve denetleyicide çok sayıda nesne eşlemesini nasıl işlerim? Asp.net mvc görünümünde ve denetleyicisinde birçok kişi için

böyle saf Poços eşlemek için varlık çerçevesini kullandı: Bence

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; } 
} 

, ben onay kutularını kullanarak bir role bir kullanıcı eklemek istiyorum. Tüm rolleri listeliyorum ve kullanıcıyı bu role eklemek için bir tane kontrol ediyorum. Bunu nasıl halledebilirim?

cevap

15
Bu senaryo için bir görünüm modeli tasarlayarak başlayacaktı

:

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; } 
} 

Sonra roller denetleyicisi:

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"); 
    } 
} 
sonra

Düzenleme görünümü (~/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" /> 
} 

ve son olarak ilgili editör şablonu (~/Views/Roles/EditorTemplates/RoleViewModel.cshtml):

@model YourAppName.Models.RoleViewModel 
<div> 
    @Model.RoleName 
    @Html.HiddenFor(x => x.RoleId) 
    @Html.CheckBoxFor(x => x.InRole) 
</div> 
+0

Bu bildirimle ilgili daha fazla bilgi alittle verebilir: 'ardından AutoMapper bir UserRolesViewModel' –

+0

Modelinizi Poços haritaya Ben automapper hakkında yeni bir soru yaptı: http://stackoverflow.com/questions/4653163/automapper -kullanım –

İlgili konular