我是ASP.NET Core的新手,我大部分现有的经验都是Java / PHP,大约10年前还有一点ASP.NET MVC。
我正在使用Mac,因此我尝试使用Visual Studio Code和ASP.NET Core构建项目。
我使用' yo'创建了一个Web应用程序。我已将默认数据库连接字符串更改为使用服务器上的MSSQL数据库。我已经运行了'dotnet ef数据库更新'命令在数据库中创建必要的表。
我想将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; }
}
}
我已经开始修改注册表单的视图模型以包含名字和姓氏,并且我已经更新了注册方法,以便将名字和姓氏保存到数据库中。
默认情况下,_LoginPartial.cshtml视图会显示用户的用户名(电子邮件地址),我想更改此选项以显示用户的全名,但我不确定如何执行此操作。< / p>
这就是_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>
}
显然我需要改变这条线;
Hello @UserManager.GetUserName(User)!
然而将其更改为@ UserManager.GetFirstname(用户)!不起作用,因为它告诉我方法&#39; GetFirstname&#39;不存在;
答案 0 :(得分:11)
我搜索了很多,最后找到了这个解决方案:
改变这个:
@UserManager.GetUserName(User)
对此:@UserManager.GetUserAsync(User).Result.LastName
请参阅:Link
答案 1 :(得分:4)
ASP.NET核心标识库使用基于声明的授权方法。这意味着登录用户(您可以通过视图中的User
对象访问的用户)具有一些与之关联的声明(名称 - 值对)列表。
默认情况下,该列表包含两个声明:ID和用户名。
但是,您可以轻松地将您需要的任何其他声明(姓/名,公司名称,当前用户余额等)添加到该列表中。
您只需要创建自己的IUserClaimsPrincipalFactory
接口实现,并在DI中注册它以覆盖默认接口。
以下是the article,其中介绍了如何执行此操作。
您可以跳过第一部分(&#34;零&#34;部分更准确)&#34;准备工作&#34;如果您已在ApplicationUser类中具有其他属性(如FirstName / LastName)。
答案 2 :(得分:1)
最后我使用了一个视图组件。
首先我创建了一个视图组件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);
}
}
}
接下来,我为视图组件创建了视图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>
}
我创建了一个模型来保存我希望在myprojectname / Models / ViewComponentModels / AccountStatusModel.cs中传递视图的数据
using System;
namespace pabulicms.Models.ViewComponentModels
{
public class AccountStatusModel
{
public ApplicationUser User { get; set; }
}
}
最后,在示例.NET网站中,我编辑了Views / Shared / _Layout.cshtml文件并替换了这一行;
@await Html.PartialAsync("_LoginPartial")
使用;
@await Component.InvokeAsync("AccountStatus")
答案 3 :(得分:-1)
我的简单方法:
视图顶部
@{
@inject UserManager<ApplicationUser> UserManager;
var DisplayName= UserManager.Users.FirstOrDefault(m=>m.UserName==User.Identity.Name).FullName;
}
你好@DisplayName
当然,这并不是表现最佳的最佳方法,但对我有用。