Asp.net mvc 3 有没有比if/else更好的方法在mvc中实现基于角色的acton和view?

Asp.net mvc 3 有没有比if/else更好的方法在mvc中实现基于角色的acton和view?,asp.net-mvc-3,asp.net-mvc-3-areas,asp.net-roles,Asp.net Mvc 3,Asp.net Mvc 3 Areas,Asp.net Roles,因此,在我的mvc.net应用程序中,我有三个角色:管理员、公司和员工,该应用程序在一个单独的数据库中使用asp.net成员身份。现在我将.net成员身份移动到另一个数据库中,因为每次修改模型时,.net成员身份表都会被删除 无论如何,我在action方法中使用if/else处理不同的角色。例如,在Index()操作中,我检查用户是否处于administrators角色,然后在此基础上创建模型和linq查询。如果用户处于公司角色,则不同查询;如果用户处于员工角色,则不同查询。检查下面的代码。将i

因此,在我的mvc.net应用程序中,我有三个角色:管理员、公司和员工,该应用程序在一个单独的数据库中使用asp.net成员身份。现在我将.net成员身份移动到另一个数据库中,因为每次修改模型时,.net成员身份表都会被删除

无论如何,我在action方法中使用if/else处理不同的角色。例如,在Index()操作中,我检查用户是否处于administrators角色,然后在此基础上创建模型和linq查询。如果用户处于公司角色,则不同查询;如果用户处于员工角色,则不同查询。检查下面的代码。将if条件传递给视图后创建的模型

我觉得这不是处理角色的最佳方式。这是处理角色的最佳方式吗?我也在考虑不同的领域,但我对不同的角色使用相同的观点,我认为这可能不会有成效

非常感谢您的任何建议/想法

[Authorize]
    public class CompanyController : Controller
    {
        private MyDBContext db = new MyDBContext();

        //
        // GET: /Company/

        public ViewResult Index()
        {
            var viewModel = new CompanyIndexViewModel();
            if (Roles.IsUserInRole("administrators")) {
                viewModel = new CompanyIndexViewModel { Companies = db.Companies.ToList() };
            }
            else if (Roles.IsUserInRole("companies")) {
                viewModel = new CompanyIndexViewModel { Companies = db.Companies.Where(c => c.Username.ToLower().Equals(this.User.Identity.Name.ToLower())).ToList() };
            }
            else if (Roles.IsUserInRole("employees")) {
                string userName = this.User.Identity.Name.ToLower();
                var companies = db.Companies.Where(c => c.Appointments.Any(a =>
                                   a.Employee.Username.ToLower() == userName)).ToList();
                viewModel = new CompanyIndexViewModel { Companies = companies.ToList() };
            }

            return View(viewModel);
        }
....

我将把构建公司列表的代码移动到它自己的方法来整理控制器操作,这也将使为当前用户确定公司列表的逻辑可重用

e、 g

私有列表GetCompanysforCurrentUser()
{
var userName=this.User.Identity.Name.ToLower();
if(Roles.IsUserInRole(“管理员”))
返回db.companys.ToList();
if(Roles.IsUserInRole(“公司”))
返回db.companys.Where(c=>c.Username.ToLower().Equals(Username)).ToList();
if(Roles.IsUserInRole(“员工”))
返回db.companys.Where(c=>c.appoints.Any(a=>
a、 Employee.Username.ToLower()==Username)).ToList();
抛出新的AuthorizationException(“用户”+用户名+“未授权”);
}
公共视图结果索引()
{
var viewModel=new companyindex viewModel{Companies=GetCompaniesForCurrentUser()};
返回视图(viewModel);
}

我会将构建公司列表的代码移动到自己的方法中,以整理控制器操作,这也会使为当前用户确定公司列表的逻辑可重复使用

e、 g

私有列表GetCompanysforCurrentUser()
{
var userName=this.User.Identity.Name.ToLower();
if(Roles.IsUserInRole(“管理员”))
返回db.companys.ToList();
if(Roles.IsUserInRole(“公司”))
返回db.companys.Where(c=>c.Username.ToLower().Equals(Username)).ToList();
if(Roles.IsUserInRole(“员工”))
返回db.companys.Where(c=>c.appoints.Any(a=>
a、 Employee.Username.ToLower()==Username)).ToList();
抛出新的AuthorizationException(“用户”+用户名+“未授权”);
}
公共视图结果索引()
{
var viewModel=new companyindex viewModel{Companies=GetCompaniesForCurrentUser()};
返回视图(viewModel);
}

我会做两件事:

首先,看看StanK说了什么,然后把它移出控制器动作。但是,我会将它一起移出控制器。这种逻辑一开始不应该真正驻留在控制器中(无论是在动作中,还是在控制器中的私有方法中)

这样想:如果你的逻辑让谁看到公司的变化呢。。你必须在各种不同的地方更换它

其次,我将为CompanyIndexViewModel创建一个构造函数,该构造函数接受一个公司列表,而不是像那样内联初始化它。CompanyIndexViewModel是否包含除公司之外的其他内容

// your controller
public ViewResult Index()
{
    var viewModel = CompanyIndexViewModel(CompanyService.GetCompaniesForCurrentUser());
    return View(viewModel);
}
理想情况下,您还可以让控制器依赖于表示“CompanyService”的接口,并将其注入控制器

它概述了如何将Ninject与MVC 3结合使用。这是可笑的简单设置的东西是如此强大,为你以后


如果你从我上面说的话中拿走一件事,那么最好从将逻辑移出控制器开始。

我会做两件事:

首先,看看StanK说了什么,然后把它移出控制器动作。但是,我会将它一起移出控制器。这种逻辑一开始不应该真正驻留在控制器中(无论是在动作中,还是在控制器中的私有方法中)

这样想:如果你的逻辑让谁看到公司的变化呢。。你必须在各种不同的地方更换它

其次,我将为CompanyIndexViewModel创建一个构造函数,该构造函数接受一个公司列表,而不是像那样内联初始化它。CompanyIndexViewModel是否包含除公司之外的其他内容

// your controller
public ViewResult Index()
{
    var viewModel = CompanyIndexViewModel(CompanyService.GetCompaniesForCurrentUser());
    return View(viewModel);
}
理想情况下,您还可以让控制器依赖于表示“CompanyService”的接口,并将其注入控制器

它概述了如何将Ninject与MVC 3结合使用。这是可笑的简单设置的东西是如此强大,为你以后


如果您从我上面所说的内容中去掉一点,那么最好从将逻辑移出控制器开始。

是的,这是更好的解决方案。现在我想知道是否有可能为这种情况创建一个横切解决方案。是的,这是更好的解决方案。现在我想知道是否有可能为这种情况创建一个横切解决方案。