如何在 View 中获取 Asp.net Core Identity User

How to get Asp.net Core Identity User in View

在Asp.net核心mvc项目中,如何获取当前View中的IdentityUser信息?

在 Web 应用程序 asp.net 核心 mvc 2.0 中,您可以使用以下代码在视图中直接使用 IdentityUser 对象:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
    <div>Hello @UserManager.GetUserName(User)!</div>
}

如果您只想在视图上显示用户名,@rdhainaut 所说的就可以了。如果这就是您所需要的,您甚至可以使用以下内容而无需注入任何东西!

@if (User.Identity.IsAuthenticated)
{
    <div>Hello, @User.Identity.Name</div>
}

原因是,使用默认配置(假设您使用的是用户名),用户名在成功登录后存储在 @User.Identity.Name 中。

现在,如果您确实想显示有关已登录用户的其他信息,例如在您的站点顶部导航中显示名称,我认为这就是 ViewComponent` 发挥作用的时候了!

例如,假设您在 MVC 项目中定义了一个 Admin 区域,并且您想要创建一个顶部导航栏。

  1. 您在 Admin 文件夹下创建了一个名为 ViewComponents 的折叠文件夹。
  2. 创建名为 TopNavbarViewComponent.cs 的视图组件。

    public class TopNavbarViewComponent : ViewComponent
    {
        private readonly UserManager<IdentityUser> _userManager;
    
        // You can inject anything you want here
        public TopNavbarViewComponent(UserManager<IdentityUser> userManager)
        {
            _userManager = userManager;
        }
    
        public async Task<IViewComponentResult> InvokeAsync()
        {
            var appUser = await _userManager.FindByNameAsync(
                HttpContext.User.Identity.Name);
    
            var vm = new TopNavbarViewModel
            {
                // Just as an example... perhaps you have additional 
                // property like FirstName and LastName in your IdentityUser.
                DisplayName = appUser?.DisplayName,
                Email = appUser?.Email,
                Phone = appUser?.PhoneNumber
            };
    
            return View(vm);
        }
    }
    
  3. 定义视图背后的模型ViewComponents\Models

    public class TopNavbarViewModel
    {
        public string DisplayName { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
    }
    
  4. 为view组件定义view,按照约定需要在Areas\Admin\Views\Shared\Components\TopNavbar\Default.cshtml

    @model Web.UI.Areas.Admin.ViewComponents.Models.TopNavbarViewModel
    
    <nav class="navbar navbar-light">
        <ul class="navbar-nav">
            <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown">
                Hello, @Model.DisplayName
            </a>
        </ul>
    </nav>