2012-07-08 22 views
1

我正在将我的crud操作从控制器移动到存储库中。如何从存储库传递viewbag信息

如何将viewbag信息从存储库传递给控制器​​,然后传递给视图?

我的控制器调用PopulateAssigneUserData在仓库中

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

我的仓库有以前住在控制器

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

回答

0

您在这里混合职责的代码。存储库不应该适用于视图模型和ViewBag。存储库应该返回域模型。管理员有责任映射这些域模型以查看模型并将这些视图模型传递给视图。这个PopulateAssigneUserData方法不应该存在于你的仓库中。在你的仓库中,你应该有一个方法返回给定一个id的aspnet_Role实例(你在编辑操作中的代码)。

+0

你是说我应该在控制器中留下那段代码吗? – MataHari 2012-07-08 17:55:55

+0

是的,你混淆了事情。存储库应该包含域模型逻辑(目前在您的控制器中)。你已经完成了它应该完成的事情。一个存储库应该绝对没有ViewBag的概念,或者根本不需要查看模型。存储库代表您的数据访问层。 – 2012-07-08 17:56:54