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

Posted

技术标签:

【中文标题】从 ASP.net Core 2 中的视图访问自定义 ApplicationUser 属性【英文标题】:Access custom ApplicationUser property from view in ASP.net Core 2 【发布时间】:2018-04-13 17:49:11 【问题描述】:

我扩展了 ApplicationUser 类以具有 2 个额外的属性,FirstNameLastName。这两个属性都正确地保存在数据库中。

public class ApplicationUser : IdentityUser

    [Required]
    [StringLength(100)]
    public string FirstName  get; set; 

    [Required]
    [StringLength(100)]
    public string LastName  get; set; 

我正在关注一个简​​单的初学者示例,有问题的代码是由具有用户身份验证的新项目命令生成的:

@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>

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

UserManager<ApplicationUser> userManager;

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

ApplicationUser user = await UserManager.GetUserAsync(claimsPrincipal);
string firstName = user.FirstName;

虽然我(个人)不太喜欢它,但.Net Core 使用以下语法支持injection into views。

@inject UserManager<ApplicstionUser> UserManager

【讨论】:

我看到我已经注入了一个用户,它的类型是ClaimsPrincipal。对用户属性的查询会是什么样子? @HMihail:我已经更新了关于使用ClaimsPrincipal 的答案。你能用你的代码更新你的问题吗? @HMihail 您可以只使用Hello @UserManager.GetUserAsync(User).Result?.FirstName,尽管首先获取 ApplicationUser 并分配给变量可能会更好。 我爱你@CalC。太容易了……为了得到上面的代码行,花了好几个小时翻阅文档。 很高兴@infocyde ☺️

以上是关于从 ASP.net Core 2 中的视图访问自定义 ApplicationUser 属性的主要内容,如果未能解决你的问题,请参考以下文章

从asp.net core 2.1中的控制器访问BackgroundService

ASP.NET Core 2.2 Razor 页面中的自定义路由

ASP.NET Core 2.1 Jwt 设置自定义声明

如何将位于应用程序部分 (DLL) 中的部分视图呈现到主 asp.net core 2.2 项目中

共享布局视图不适用于 ASP.NET Core 2.1 中的所有视图

从 ASP.NET Core Web API 中的控制器访问用户身份