我正在检查_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”,检查可能会尽可能快。
仍然,我想知道是否有可能进一步改进它。
您可以在某个方便的位置定义角色到字典中索引的映射:
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();
这里假定值最低的索引与当前用户最匹配。