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

问题描述 投票:0回答:1

我正在检查_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;

然后我将ix用作string[] btnDesign[]中的索引器:

class="btn @(btnDesign[ix])"

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

更新我已经对其进行了“优化”。看到“ GroupUser”比“ SiteAdmin”更多,我打开了检查头(并删除了一个角色,SupportAgent):

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

现在,对于大多数已登录用户,即“ GroupUser”,检查可能会尽可能快。

仍然,我想知道是否有可能进一步改进它。

c# asp.net-core-identity
1个回答
1
投票

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

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

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

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

现在,考虑用户具有的角色,确定“最重要”的索引

int significantIndex = roleMapping
                         .Where(kv => roles.Contains(kv.Key))
                         .Select(kv => kv.Value)
                         .Min();

这里假定值最低的索引与当前用户最匹配。

© www.soinside.com 2019 - 2024. All rights reserved.