如何在ASP.NET Core的登录部分视图中显示用户全名

She*_*tal 7 asp.net-core

我是ASP.NET Core的新手,我大部分现有的经验都是Java/PHP,大约10年前还有一点ASP.NET MVC.

我正在使用Mac,所以我正在尝试使用Visual Studio Code和ASP.NET Core构建项目.

我使用'yo'创建了一个Web应用程序.我已经更改了默认数据库连接字符串以使用我在服务器上的MSSQL数据库.我运行'dotnet ef database update'命令在数据库中创建必要的表.

我想为用户添加firstname和lastname,所以我在AspNetUser表中创建了列,并编辑了ApplicationUser类以反映这一点;

namespace pabulicms.Models
{
    // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser
    {

        public string Firstname { get; set; }
        public string Lastname { get; set; }

    }
}
Run Code Online (Sandbox Code Playgroud)

我已经开始修改注册表单的视图模型以包含firstname和lastname,并且我已经更新了Signup方法,以便将firstname和lastname保存到数据库中.

默认情况下,_LoginPartial.cshtml视图显示用户的用户名(电子邮件地址),我想更改此选项以显示用户的全名,但我不确定如何执行此操作.

这就是_LoginPartial目前的样子;

@using Microsoft.AspNetCore.Identity
@using pabulicms.Models

@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>
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li><a asp-area="" asp-controller="Account" asp-action="Register">Register</a></li>
        <li><a asp-area="" asp-controller="Account" asp-action="Login">Log in</a></li>
    </ul>
}
Run Code Online (Sandbox Code Playgroud)

这显然是我需要改变的这条线;

Hello @UserManager.GetUserName(User)!
Run Code Online (Sandbox Code Playgroud)

但是将其更改为@ UserManager.GetFirstname(User)!不起作用,因为它告诉我'GetFirstname'方法不存在;

小智 16

我搜索了很多,最后找到了这个解决方案:

改变这个: @UserManager.GetUserName(User)

对此: @UserManager.GetUserAsync(User).Result.LastName

参考:链接

  • 1000枚金牌给你先生。 (2认同)
  • 最好是`await`而不是`.Result`,像这样:`@((await UserManager.GetUserAsync(User))。LastName)`,看起来有点不好,但是速度更快:D (2认同)

小智 6

ASP.NET Core Identity库使用基于声明的方法进行授权。这意味着已登录的用户(您可以通过User视图中的对象访问的用户)具有与其相关的一些声明(名称-值对)列表。默认情况下,该列表包含两个声明:ID和用户名。但是,将所需的其他任何声明(名字/姓氏,公司名称,当前用户的余额等)添加到该列表中很容易。
您只需要创建自己的IUserClaimsPrincipalFactory接口实现并将其注册到DI中即可覆盖默认接口。

下面是文章与一步一步的说明如何做到这一点。

如果您在ApplicationUser类中已经具有其他属性(例如FirstName / LastName),则可以跳过第一部分(更确切地说是“零”部分)“准备”。


She*_*tal 3

最后我使用了视图组件。

首先,我创建了一个视图组件 myprojectname/ViewComponents/AccountStatusViewComponent.cs

namespace myprojectname.ViewComponents
{
    public class AccountStatusViewComponent : ViewComponent
    {

        private readonly SignInManager<ApplicationUser> _signInManager;
        private readonly UserManager<ApplicationUser> _userManager;

        public AccountStatusViewComponent(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
        {
            _signInManager = signInManager;
            _userManager = userManager;
        }

        public async Task<IViewComponentResult> InvokeAsync()
        {
            AccountStatusModel model = new AccountStatusModel();
            model.User = _userManager.GetUserAsync(Request.HttpContext.User).Result;

            return View(model);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我为视图组件 myprojectname/Views/Shared/Components/AccountStatus/Default.cshtml 创建了视图

@model AccountStatusModel

@using Microsoft.AspNetCore.Identity
@using myprojectname.Models.ViewComponentModels;
@using myprojectname.Models

@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 @Model.User.Firstname @Model.User.Lastname</a>
            </li>
            <li>
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
            </li>
        </ul>
    </form>
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li><a asp-area="" asp-controller="Account" asp-action="Register">Register</a></li>
        <li><a asp-area="" asp-controller="Account" asp-action="Login">Log in</a></li>
    </ul>
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个模型来保存我想要在 myprojectname/Models/ViewComponentModels/AccountStatusModel.cs 中传递视图的数据

using System;
namespace pabulicms.Models.ViewComponentModels
{
    public class AccountStatusModel
    {
        public ApplicationUser User { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,在示例 .NET 网站中,我编辑了文件 Views/Shared/_Layout.cshtml 并替换了这一行;

@await Html.PartialAsync("_LoginPartial")
Run Code Online (Sandbox Code Playgroud)

和;

@await Component.InvokeAsync("AccountStatus")
Run Code Online (Sandbox Code Playgroud)