0

所以我在我的 mvc .net 应用程序中拥有三个角色,管理员、公司和员工,该应用程序在单独的数据库中使用 asp.net 成员资格。我现在将 .net 成员资格移到了不同​​的数据库中,因为每次我修改模型时,.net 成员资格表都会被删除。

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

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

非常感谢任何建议/想法。

[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);
        }
....
4

2 回答 2

2

我会做两件事:

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

可以这样想:如果你关于谁可以看到哪些公司发生变化的逻辑怎么办……你必须在各种不同的地方改变它。

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

// your controller
public ViewResult Index()
{
    var viewModel = CompanyIndexViewModel(CompanyService.GetCompaniesForCurrentUser());
    return View(viewModel);
}

理想情况下,您还可以让您的控制器依赖于表示“CompanyService”的接口,并将其注入到您的控制器中。

看一看这个博客,它概述了将 Ninject 与 MVC 3 一起使用。为以后对您如此强大的东西进行设置非常简单。

如果您从我上面所说的内容中拿走一件事,最好从将您的逻辑移出控制器开始。

于 2012-07-17T04:03:10.060 回答
1

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

例如

private List<Company> GetCompaniesForCurrentUser()
{
    var userName = this.User.Identity.Name.ToLower();

    if (Roles.IsUserInRole("administrators"))
        return db.Companies.ToList();

    if (Roles.IsUserInRole("companies"))
        return db.Companies.Where(c => c.Username.ToLower().Equals(userName)).ToList();

    if (Roles.IsUserInRole("employees"))
        return db.Companies.Where(c => c.Appointments.Any(a =>
        a.Employee.Username.ToLower() == userName)).ToList();

    throw new AuthorizationException("User " + userName + " is not authorised.");

}


public ViewResult Index()
{
    var viewModel = new CompanyIndexViewModel { Companies = GetCompaniesForCurrentUser() };
    return View(viewModel);
}
于 2012-07-17T01:17:21.713 回答