2

我有很多检查来确定用户的角色,然后分配角色编号。有什么方法可以简化检查吗?

        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 语句对我来说都不是好的编码习惯。

4

6 回答 6

3

您可以向您的 User 类添加一个属性:

    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
于 2012-05-25T17:41:11.553 回答
2

如果一个用户只有一个角色,你可以使用 GetRoles 方法,它返回一个角色数组,来检查它是否有任何值。
如果是这样 - 您可以将用户拥有的第一个也是唯一一个角色解析为枚举,其中包含您要提供视图包的值。如果数组没有值 - 您可以提供默认最小值。


如果有多个角色,则可以以更“复杂的方式”解决,但最终开发、理解和执行可能比简单的 if..else 代码花费更多

于 2012-05-25T17:35:07.140 回答
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
}
于 2012-05-25T17:54:20.737 回答
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;
}
于 2012-05-25T17:36:35.597 回答
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));
于 2012-05-25T19:00:56.333 回答
0

扩展 ASP.NET 的 Role 表怎么样?如果每个角色都有固定的权重,则创建一个表(称为RoleWeight或其他)并为该角色设置所需的权重。这样,您不必设置任何东西(并消除“看起来不像好的编码实践”的代码),而是已经存在价值。

于 2012-05-25T17:32:07.210 回答