如何在ASP.NET Core

时间:2017-05-10 11:46:48

标签: asp.net-core

我是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;不存在;

4 个答案:

答案 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

当然,这并不是表现最佳的最佳方法,但对我有用。