2011-01-10 9 views
6

Wie gehe ich mit einem viel zu viele Objekt-Mapping in der Ansicht und Controller im Zusammenhang mit users und roles?Viele zu viele in asp.net MVC Ansicht und Controller

Ich benutzte Rahmen Einheit reinen POCOs wie diese zur Karte:

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

Meiner Ansicht nach, ich möchte einen Benutzer zu einer Rolle mit Kontrollkästchen hinzuzufügen. Ich listet alle Rollen auf und prüft dann einen, um den Benutzer zu dieser Rolle hinzuzufügen. Wie gehe ich damit um?

Antwort

15

ich von der Gestaltung eines View-Modell für dieses Szenario beginnen würde:

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

Dann ein Rollen-Controller:

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

dann die Edit-Ansicht (~/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" /> 
} 

und schließlich die entsprechende Editor-Vorlage (~/Views/Roles/EditorTemplates/RoleViewModel.cshtml):

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

Könnten Sie alittle weitere Informationen zu dieser Erklärung geben: 'dann AutoMapper Ihr Modell abzubilden POCOs zu einem UserRolesViewModel' –

+0

ich eine neue Frage zu AutoMapper gemacht: http://stackoverflow.com/questions/4653163/automapper -Verwendung –