2012-05-25 65 views
2

我有很多檢查來確定用戶在 中的角色,然後分配角色號。有沒有辦法可以簡化檢查?有沒有另一種方法可以檢查用戶所在的.net角色?

 if (User.IsInRole("Super")) 
     { 
      ViewBag.Role = 30; 
     } 
     else if (User.IsInRole("Admin")) 
     { 
      ViewBag.Role = 20; 
     } 
     ... 
     ... 
     else if (User.IsInRole("Guest")) 
     { 
      ViewBag.Role = 10; 
     } 
     else 
     { 
      ViewBag.Role = 5; 
     } 

我需要做的是找到用戶的最高角色,然後分配一個值ViewBag.Role這是一個動態變量。上面的代碼確實有效,但是所有if和else語句對我來說都不是很好的編碼習慣。

+0

您可以顯示User.IsInRole()代碼?這將有所幫助 – MikeTWebb

+0

switch語句如何? – Limey

+0

用於識別多個if/switch語句的代碼異味。 –

回答

3

您可以將屬性添加到您的用戶等級:

public virtual int RoleNumber 
    { 
     get 
     { 
      if (this.IsInRole("Super")) return 30; 
      if (this.IsInRole("Admin")) return 20; 
      if (this.IsInRole("Guest")) return 10; 
      return 5; 
     } 
    } 

而且然後在查看:

ViewBag.Role = User.RoleNumber 
+0

可能是一個擴展方法,因爲我認爲是從框架中的User類 –

0

如何擴展ASP.NET的角色表?如果每個角色都有固定的權重,則創建一個表格(稱爲RoleWeight或其他),並用該角色設置您想要的權重。這樣,你不必設置任何東西(並且消除「看起來不像良好的編碼習慣」的代碼),而是已經有了價值。

2

如果用戶只有一個角色,則可以使用GetRoles方法返回一個角色數組,以檢查它是否具有任何值。
如果確實如此 - 您可以解析用戶所擁有的第一個和唯一角色,並將其作爲您想要提供視圖包的值的枚舉。如果數組沒有值 - 您可以提供默認最小值。


如果有多個角色,可以用更復雜的方式來解決,但是一天結束後,開發,理解和執行可能比簡單的if要花費更多。的.else代碼

1

你可以嘗試成才這樣的:

Dictionary<string, int> weight = new Dictionary<string, int>(); 
weight.Add("Super", 30); 
weight.Add("Admin", 20); 
weight.Add("Guest", 10); 

string[] roles = Roles.GetRolesForUser(User.Identity.Name); 
if (roles.Any()) 
{ 
    ViewBag.Role = weight.Where(w => roles.Contains(w.Key)) 
    .OrderBy(w => w.Value) 
    .FirstOrDefault(); 
} 
else 
{ 
    ViewBag.Role = 5; 
} 
2

我會使用枚舉而不是字符串。這使您可以在編譯時檢查名稱。

以下代碼爲您提供了更改(廣告或刪除)角色的靈活性,而不必更改下劃線角色檢查邏輯。

public int IsInRole() 
    { 
     int defaultValue = (int)UserRole.Default; 
     var names = Enum.GetNames(typeof (UserRole)); 

     foreach (var name in names) 
     { 
      if(User.IsInRole(name)) 
      { 
       defaultValue = (int)((UserRole)Enum.Parse(typeof(UserRole), name)); 
       break; 
      } 
     } 

     return defaultValue; 
    } 

public enum UserRole 
{ 
    Super = 30, 
    Admin = 20, 
    Guest = 10, 
    Default = 5 
} 
1

假設你有你的角色類作爲

public class Role 
{ 
    public string Name { get; set; } 
    public int Number { get; set; } 
    ...... 
} 

您可以使用

var roles = GetYourRoles(); // IEnumerable<Role>  
var result = roles.First(r => User.IsInRole(r.Name)); 
相關問題