我是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'方法不存在;
小智 6
ASP.NET Core Identity库使用基于声明的方法进行授权。这意味着已登录的用户(您可以通过User视图中的对象访问的用户)具有与其相关的一些声明(名称-值对)列表。默认情况下,该列表包含两个声明:ID和用户名。但是,将所需的其他任何声明(名字/姓氏,公司名称,当前用户的余额等)添加到该列表中很容易。
您只需要创建自己的IUserClaimsPrincipalFactory接口实现并将其注册到DI中即可覆盖默认接口。
下面是文章与一步一步的说明如何做到这一点。
如果您在ApplicationUser类中已经具有其他属性(例如FirstName / LastName),则可以跳过第一部分(更确切地说是“零”部分)“准备”。
最后我使用了视图组件。
首先,我创建了一个视图组件 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)
| 归档时间: |
|
| 查看次数: |
6005 次 |
| 最近记录: |