2012-05-25 133 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)); 
相关问题