我应该如何检查用户在视图中的角色?

How should I check the user's roles in a view?

我正在检查 _LoginPartial.cshtml 中登录用户的角色,以根据角色更改设计元素。

这是一个好的方法,还是有更好的方法?

int ix = User.IsInRole("SiteAdmin")
    ? 0
    : User.IsInRole("SysOp")
        ? 1
        : User.IsInRole("SupportAgent")
            ? 2
            : User.IsInRole("GroupAdmin")
                ? 3
                : User.IsInRole("GroupUser")
                    ? 4
                    : 5;

然后我在 string[] btnDesign[]:

中使用 ix 作为索引器
class="btn @(btnDesign[ix])"

我知道我的检查可能会导致五次单独访问数据库,这就是我问这个问题的原因。

更新 我已经"optimized"咯。看到 "GroupUser" 的数量多于 "SiteAdmin" 的数量,我将检查放在首位(并删除了一个角色,SupportAgent):

int ix = User.IsInRole("GroupUser")
    ? 0
    : User.IsInRole("GroupAdmin")
        ? 1
        : User.IsInRole("SysOp")
            ? 2
            : User.IsInRole("SiteAdmin")
                ? 3
                : 4;

现在,对于大多数已登录用户("GroupUser"s)来说,检查可能会尽可能快。

不过,我想知道是否可以进一步改进它。

您可以在字典中某个方便的地方定义角色到索引的映射:

var roleMapping = new Dictionary<string,int>();
roleMapping.Add("SiteAdmin", 0);
...

在您的代码中,您可以在一次调用中检索用户的所有角色:

var idUser = UserManager.GetUserAsync(User).Result;
var roles = UserManager.GetRolesAsync(idUser).Result;

现在,确定 "most significant" 索引,考虑用户通过

拥有的角色
int significantIndex = roleMapping
                         .Where(kv => roles.Contains(kv.Key))
                         .Select(kv => kv.Value)
                         .Min();

此处假定具有最低值的索引是当前用户的最佳匹配。