Asp.net mvc 3 如何从存储库传递viewbag信息

Asp.net mvc 3 如何从存储库传递viewbag信息,asp.net-mvc-3,Asp.net Mvc 3,我正在将crud操作从控制器移动到存储库中 如何将viewbag信息从存储库传递到控制器,然后再传递到视图 我的控制器调用存储库中的PopulatesSigneurData 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.M

我正在将crud操作从控制器移动到存储库中

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

我的控制器调用存储库中的PopulatesSigneurData

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;
        }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统数据;
使用WWW.Models;
使用WWW.ViewModels;
名称空间WWW.DAL
{
公共类Aspnet_角色存储:Iaspnet_角色存储,Iaspnet_用户存储,IDisposable
{
私人世界背景;
公共Aspnet_角色存储库(WorldofWarCraftContext)
{
this.context=上下文;
}
公共IEnumerable GetRoles()
{
返回context.aspnet_Roless.ToList();
}
公共aspnet_角色GetRolesByID(Guid id)
{
返回context.aspnet_Roless.Find(id);
}
私有void PopulatesSigneurData(aspnet\u角色aspnet\u角色)
{
var alluser=context.aspnet\u用户;
var rolesUsers=newhashset(aspnet_Role.aspnet_User.Select(c=>c.UserId));
var viewModel=新列表();
foreach(allUsers中的var用户)
{
viewModel.Add(新的AssigneUserData
{
UserId=User.UserId,
UserName=User.UserName,
Assigned=rolesUsers.Contains(User.UserId)
});
}
ViewBag.Users=viewModel;
}

您在这里混合了责任。存储库不应与视图模型和ViewBag一起工作。存储库应返回域模型。控制器负责将这些域模型映射到视图模型,并将这些视图模型传递到视图。此
PopulatesSigneurData
方法不应存在于您的repos中目录。在您的存储库中,您应该有一个方法,该方法返回一个给定id的
aspnet\u角色
实例(您当前在编辑操作中拥有的代码)。

您是说我应该将这段代码留在控制器中吗?是的,您把事情弄混了。存储库应该包含域模型逻辑(当前在您的控制器中)。您所做的与应该做的完全相反。存储库应该完全没有ViewBag或视图模型的概念。存储库代表您的数据访问层。