2012-07-16 51 views
0

所以我有三個角色,管理員,公司和員工在我的mvc.net應用程序中使用單獨的數據庫中的asp.net成員資格。我現在將.net成員資格移動到了另一個數據庫中,因爲每次修改模型時,.net成員資格表都會被刪除。有沒有更好的方式來實現基於角色的acton和在MVC中查看比if/else?

無論如何,我正在使用操作方法中的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); 
     } 
.... 

回答

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

是的,這是更好的解決方案。現在我想知道是否有可能爲這種情況創建一個橫切解決方案。 – Thupten 2012-07-17 02:38:18

+0

是的 - 請參閱@Simon Whitehead的回答 – StanK 2012-07-17 05:05:07

2

有兩件事我會做:

首先,什麼發臭說,並將其移出控制器的動作。不過,我會把它一起移出控制器。這種邏輯不應該真正駐留在Controller中(無論是在操作中,還是在控制器中使用私有方法)。

想想這樣:如果你的邏輯是誰看到公司的變化..你將不得不在各種不同的地方改變它。

其次,我會爲CompanyIndexViewModel創建一個構造函數,該構造函數接受公司列表,而不是像這樣內聯地初始化它。 CompanyIndexViewModel包含除公司以外的其他內容嗎?

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

理想情況下,你也有你的控制取決於代表「CompanyService」在接口上,並有注入到你的控制器。

Take a look at this blog其中概述了使用MVC 3使用Ninject。它是很荒唐簡單的設置爲你以後如此強大的東西。

如果您從上面所說的事情中拿出一件事,最好先將您的邏輯移出控制器。

相關問題