2012-07-08 3 views
1

Je déplace mes opérations crud du contrôleur vers un référentiel.Comment transmettre les informations du viewbag à partir du référentiel

Comment puis-je transmettre les informations du viewbag du référentiel au contrôleur, puis à la vue?

Mes appels contrôleur PopulateAssigneUserData dans le référentiel

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using WWW.Models; 
using WWW.DAL; 
using WWW.ViewModels; 

namespace WWW.Controllers 
{ 
    public class RolesController : Controller 
    { 
     private Iaspnet_RolesRepository aspnet_RolesRepository; 

     public RolesController() 
     { 
      this.aspnet_RolesRepository = new Aspnet_RolesRepository(new WorldofWarCraftContext()); 
     } 

     public RolesController(Iaspnet_RolesRepository aspnet_RolesRepository) 
     { 
      this.aspnet_RolesRepository = aspnet_RolesRepository; 
     } 


     // 
     // GET: /Roles/Edit/5 

     public ActionResult Edit(Guid id) 
     { 
      aspnet_Roles aspnet_Role = db.aspnet_Roless   
      .Include(i => i.aspnet_User) 
      .Where(i => i.RoleId == id) 
      .Single(); 

      PopulateAssigneUserData(aspnet_Role); 
      return View(aspnet_Role); 
     } 

Mon référentiel a le code qui permet de vivre dans le contrôleur

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Data; 
using WWW.Models; 
using WWW.ViewModels; 

namespace WWW.DAL 
{ 
    public class Aspnet_RolesRepository : Iaspnet_RolesRepository, Iaspnet_UsersRepository , IDisposable 
    { 
     private WorldofWarCraftContext context; 

     public Aspnet_RolesRepository(WorldofWarCraftContext context) 
     { 
      this.context = context; 
     } 

     public IEnumerable<aspnet_Roles> GetRoles() 
     { 
      return context.aspnet_Roless.ToList(); 
     } 

     public aspnet_Roles GetRolesByID(Guid id) 
     { 
      return context.aspnet_Roless.Find(id); 
     } 


     private void PopulateAssigneUserData(aspnet_Roles aspnet_Role) 
     { 
      var allUsers = context.aspnet_Users; 
      var rolesUsers = new HashSet<Guid>(aspnet_Role.aspnet_User.Select(c => c.UserId)); 
      var viewModel = new List<AssigneUserData>(); 
      foreach (var User in allUsers) 
      { 
       viewModel.Add(new AssigneUserData 
       { 
        UserId = User.UserId, 
        UserName = User.UserName, 
        Assigned = rolesUsers.Contains(User.UserId) 
       }); 
      } 
      ViewBag.Users = viewModel; 
     } 

Répondre

0

Vous confondez les responsabilités ici. Un référentiel ne doit pas fonctionner avec les modèles de vue et ViewBag. Un référentiel doit renvoyer les modèles de domaine. Il appartient au contrôleur de mapper ces modèles de domaine pour afficher les modèles et transmettre ces modèles de vue à la vue. Cette méthode PopulateAssigneUserData ne doit pas figurer dans votre référentiel. Dans votre dépôt, vous devriez avoir une méthode qui renvoie une instance aspnet_Role avec un identifiant (le code que vous avez actuellement dans votre action Modifier).

+0

Voulez-vous dire que je devrais laisser ce morceau de code dans le contrôleur? – MataHari

+0

Oui, vous avez mélangé les choses. Le référentiel doit contenir la logique du modèle de domaine (qui est actuellement dans votre contrôleur). Vous avez fait exactement l'inverse de ce qu'il devrait être fait. Un référentiel ne devrait absolument pas avoir la moindre notion de ViewBag ou de modèles de vue. Un référentiel représente votre couche d'accès aux données. –

Questions connexes