如何在视图中获取 Asp.net Core Identity 用户

rdh*_*aut 2 asp.net-core-identity asp.net-core-mvc-2.0

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

rdh*_*aut 5

在 Web 应用程序 asp.net core 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>
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ang 5

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

@if (User.Identity.IsAuthenticated)
{
    <div>Hello, @User.Identity.Name</div>
}
Run Code Online (Sandbox Code Playgroud)

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

现在,如果您确实想显示有关登录用户的其他信息,例如站点顶部导航上的显示名称,那么我认为 ViewComponent` 就派上用场了!

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

  1. 您创建一个名为折叠ViewComponentsAdmin的文件夹。
  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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 定义视图 underler 后面的模型ViewComponents\Models

    public class TopNavbarViewModel
    {
        public string DisplayName { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 定义视图组件的视图,按照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>
    
    Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供我在这里看到的最完整的答案之一。人们常常给出 1/2 的答案,这确实没有帮助。尤其是像 Core 3.0 这样的东西,它的后台似乎有着超出其应有的魔力。我使用了您的答案和 MS 的此页面,其中详细介绍了如何更改一些默认值。https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-3.1 (2认同)