尝试获取用户名.net core 2.1时,用户始终为null

时间:2019-07-29 18:24:20

标签: c# .net .net-core

我正在尝试使用此功能获取实际登录用户的名称:

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。我尝试注销并在应用程序运行时再次登录,但是它不起作用。

怎么了?

2 个答案:

答案 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>
    }