如何从Razor Page的UserId中获取.NetCore身份的UserName?

时间:2019-11-23 08:19:51

标签: .net-core razor-pages asp.net-core-identity

我需要基于UserId从.Net Core 3.0中的IdentityUser类获取帖子作者的UserName。用户ID是我的帖子表中的一列。

到目前为止,我已经尝试添加此内容

@使用Microsoft.AspNetCore.Identity @inject UserManager UserManager

@ {var用户名=等待UserManager.FindByIdAsync(Model.Posts.Userid).Result.UserName}

不幸的是,这给出了运行时错误“对象引用未设置为对象的实例。”

我无法将数据库中的脚手架添加到上下文类,因为当我这样做时,由于添加到上下文中的任何表都被视为默认IdentityUser类的重复,因此该应用程序将无法运行。

我尝试过Google搜索“ .net core按ID获取用户名”之类的内容,但是我发现的所有示例仅获取登录用户的用户名或ID。我想获取用户名,该用户名与posts表中的作者ID匹配。

一个更好的解决方案是从我制作的PostsService类中获取UserName,但我不知道如何获取不在ApplicationDbContext中的内容的外键值

3 个答案:

答案 0 :(得分:0)

等待时不要使用.Result

@{var username = (await UserManager.FindByIdAsync(Model.Posts.Userid))?.UserName;}

像这样的逻辑最好放在控制器中。

答案 1 :(得分:0)

在控制器中,您可以注入UserManager<IdentityUser>以获取用户名:

private readonly ILogger<IndexModel> _logger;
private readonly UserManager<IdentityUser> _userManager;
public IndexModel(ILogger<IndexModel> logger, UserManager<IdentityUser> userManager)
{
    _logger = logger;
    _userManager = userManager;
}

public async Task OnGetAsync()
{
    var user = await _userManager.FindByIdAsync("975c96e2-85a4-46ac-8211-53c8ebae0e87");
    if (user != null)
    {
        var name = user.UserName;
    }
}

为什么要使用OnGetAsync方法而不是OnPostAsync方法发布数据?

答案 2 :(得分:0)

我有完全相同的问题。我结束了在BlogPost模型中创建另一个字段来保存发帖人的用户名,并在创建帖子时使用下面的第一种解决方案来检索发帖人的用户名。然后,将发帖人的姓名与该帖子一起存储在数据库中,很容易将其与其他帖子信息一起检索。