从ASP.net Core 2中的视图访问自定义ApplicationUser属性

H M*_*ail 4 razor asp.net-identity asp.net-core

我扩展了ApplicationUser类,有2个额外的属性,FirstNameLastName.两个属性都在数据库中正确保留.

public class ApplicationUser : IdentityUser
{
    [Required]
    [StringLength(100)]
    public string FirstName { get; set; }

    [Required]
    [StringLength(100)]
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在关注一个简​​单的初学者示例,并且有问题的代码是由New Project with User Authentication命令生成的:

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
    <form asp-area="" asp-controller="Account" asp-action="Logout" method="post" id="logoutForm" class="navbar-right">
        <ul class="nav navbar-nav navbar-right">
            <li>
                <a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
            </li>
            <li>
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
            </li>
        </ul>
    </form>
}
Run Code Online (Sandbox Code Playgroud)

而不是Hello @UserManager.GetUserName(User)!我想说的Hello ???????.FirstName!

我找不到从视图中访问这些额外属性的方法.有关如何做到这一点的任何建议?

谢谢!

Cal*_*alC 10

您需要将UserManager注入您的服务(或在您的情况下查看).这有一个泛型类型参数,在您的情况下将是ApplicationUser:

UserManager<ApplicationUser> userManager;
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过UserManager.Users属性查询用户.或者,如果您需要获取当前用户并让他们ClaimsPrincipal可以使用以下代码来检索相应的ApplicationUser:

ApplicationUser user = await UserManager.GetUserAsync(claimsPrincipal);
string firstName = user.FirstName;
Run Code Online (Sandbox Code Playgroud)

虽然我(个人)对此不太热衷,但.Net Core支持使用以下语法注入视图.

@inject UserManager<ApplicstionUser> UserManager
Run Code Online (Sandbox Code Playgroud)

  • @HMihail您可以使用`Hello @ UserManager.GetUserAsync(User).Result?.FirstName`尽管首先获取ApplicationUser并分配给变量可能更好. (4认同)