我正在尝试使用此功能获取实际登录用户的名称:
public string GetUserName()
{
return User.FindFirst(ClaimTypes.Name).Value;
}
这是我从.cshtml文件中调用此函数的方式:
@{
RoleController role = new RoleController();
}
@if (role.GetUserName()==("test"))
{
<li class="@ManageNavPages.PersonalDataNavClass(ViewContext)"><a asp-page="./NewVisit">Umów wizytę</a></li>
}
但是当调用方法GetUserName()
时,我在NullReferenceException
上得到了User
。我尝试注销并在应用程序运行时再次登录,但是它不起作用。
怎么了?
答案 0 :(得分:1)
这不是在视图中访问User
的方式。控制器需要由框架创建,该框架将根据他的请求进行填充。
我建议创建一种扩展方法以提供所需的功能
public static string GetUserName(this IPrincipal user)
{
return ((ClaimsPrincipal) user)?.FindFirst(ClaimTypes.Name)?.Value ?? string.Empty;
}
您可以在视图中访问User
,因此可以调用扩展方法
@if (User.GetUserName()==("test"))
{
<li class="@ManageNavPages.PersonalDataNavClass(ViewContext)"><a asp-page="./NewVisit">Umów wizytę</a></li>
}
答案 1 :(得分:0)
我认为创建新的RoleController()与访问控制器并不相同。
在您的情况下,最简单的方法是使用ViewBag
保存并稍后使用结果。
因此在控制器中您可以这样做:
ViewBag.IsTestUser = GetUserName()=="test";
在您的cshtml中,将其用作:
@if (ViewBag.IsTestUser)
{
<li class="@ManageNavPages.PersonalDataNavClass(ViewContext)"><a asp-page="./NewVisit">Umów wizytę</a></li>
}