使用我的代码,我只能从列表中获得第一个角色。如何使用剃刀显示登录用户具有的所有角色
@using System.Security.Claims
@{
var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
var roleOfUser = claimsIdentity != null ? claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value : "User";
}
<div class="col-md-9 text-center " id="logoutForm">
@Html.DisplayName("Profile " + roleOfUser)
</div>
答案 0 :(得分:0)
更改Linq查询以返回IEnumerable,并使用@foreach循环显示值
@using System.Security.Claims
@{
var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
var rolesOfUser = claimsIdentity != null ? claimsIdentity.Claims.Where(x =>
x.Type == ClaimTypes.Role).Select(c=>c.Value) : "User";
}
<div class="col-md-9 text-center " id="logoutForm">
@foreach(var item in rolesOfUser)
{
Html.DisplayName("Profile " + item)
}
</div>
答案 1 :(得分:0)
我刚刚将SingleOrDefault
替换为ToList
,并将字符串连接在一起:
@using System.Security.Claims
@{
var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
var roleOfUser = claimsIdentity != null ? string.Join(", ", claimsIdentity.Claims.Where(x => x.Type == ClaimTypes.Role).Select(x=>x.Value).ToList()): "User";
}
<div class="col-md-9 text-center " id="logoutForm">
@Html.DisplayName("Profile " + roleOfUser)
</div>
您真的很近,但是您使用的是SingleOrDefault
,在这种情况下,它返回一个条目或null
。 ToList
将所有结果返回到该查询。 string.Join
使用,
作为分隔符将所有字符串连接在一起。
答案 2 :(得分:0)
您只是获得用户的第一个角色并显示它。如果要全部获取,请改用产生IEnumerable
的方法之一。
例如,您可以执行以下操作:
@using System.Security.Claims
@{
Claim[] rolesOfUser = null;
var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
if (claimsIdentity != null)
{
rolesOfUser = claimsIdentity.Claims.Where(x => x.Type ==ClaimTypes.Role).ToArray();
}
}
@if (rolesOfUser != null && rolesOfUser.Any())
{
<div class="col-md-9 text-center " id="logoutForm">
<ul class="list-group user-roles">
@foreach(var role in rolesOfUser){
<li class="list-group-item">
@Html.DisplayName("Profile " + role)
</li>
}
</ul>
</div>
}
else
{
<div class="alert alert-danger">
No roles where found!
</div>
}
在这里,您将获得具有角色类型的用户的所有声明,并将它们显示在列表中。
虽然上述解决方案有效,但这并不是最干净的方法。最佳做法是在控制器上创建一个模型,并将其作为模型传递给视图。该模型应仅包含要在视图上显示的元素。这样一来,您就不会最终将用于提取角色的逻辑与表示逻辑混合在一起,并且视图将变得更干净。
更新: 有关更清洁的实现,请参见此提琴:https://dotnetfiddle.net/hM7prf
希望这会有所帮助!