如何在 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
区域,并且您想要创建一个顶部导航栏。
- 您在
Admin
文件夹下创建了一个名为 ViewComponents
的折叠文件夹。
创建名为 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);
}
}
定义视图背后的模型ViewComponents\Models
。
public class TopNavbarViewModel
{
public string DisplayName { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
}
为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>
在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
区域,并且您想要创建一个顶部导航栏。
- 您在
Admin
文件夹下创建了一个名为ViewComponents
的折叠文件夹。 创建名为
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); } }
定义视图背后的模型
ViewComponents\Models
。public class TopNavbarViewModel { public string DisplayName { get; set; } public string Email { get; set; } public string Phone { get; set; } }
为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>