.net core 如何通过Razor页面中的UserId从.NetCore标识中获取用户名?

.net core 如何通过Razor页面中的UserId从.NetCore标识中获取用户名?,.net-core,razor-pages,asp.net-core-identity,.net Core,Razor Pages,Asp.net Core Identity,我需要根据UserId从.Net Core 3.0中的IdentityUser类中获取文章作者的用户名。用户id是“我的帖子”表中的一列 到目前为止,我已经尝试添加了这个 @使用Microsoft.AspNetCore.Identity @注入用户管理器用户管理器 @{var username=await UserManager.FindByIdAsync(Model.Posts.Userid).Result.username} 不幸的是,这会导致运行时错误“对象引用未设置为对象的实例” 我无法

我需要根据UserId从.Net Core 3.0中的IdentityUser类中获取文章作者的用户名。用户id是“我的帖子”表中的一列

到目前为止,我已经尝试添加了这个

@使用Microsoft.AspNetCore.Identity @注入用户管理器用户管理器

@{var username=await UserManager.FindByIdAsync(Model.Posts.Userid).Result.username}

不幸的是,这会导致运行时错误“对象引用未设置为对象的实例”

我无法将脚手架从数据库添加到上下文类,因为当我添加到上下文类时,应用程序将不会运行,因为添加到上下文的任何表都被视为默认IdentityUser类的副本

我曾尝试在谷歌上搜索“.net core按id获取用户名”,但我找到的所有示例都只获取登录用户的用户名或id。我想获取用户名,其中userid与posts表中的author id匹配


一个更好的解决方案是从我创建的PostsService类中获取用户名,但我不知道如何获取应用程序中未包含的内容的外键值。请不要使用。等待结果

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

这样的逻辑也可以更好地放在控制器中。

不要使用。等待结果时再使用

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

这样的逻辑也可以更好地放在控制器中。

在控制器中,您可以插入
UserManager
以获取用户名:

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;
    }
}
专用只读ILogger\u记录器;
私有只读用户管理器_UserManager;
公共索引模型(ILogger记录器、UserManager UserManager)
{
_记录器=记录器;
_userManager=userManager;
}
公共异步任务OnGetAsync()
{
var user=wait(u userManager.FindByIdAsync)(975c96e2-85a4-46ac-8211-53c8ebae0e87);;
如果(用户!=null)
{
var name=user.UserName;
}
}

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

在控制器中,可以插入
UserManager
以获取用户名:

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;
    }
}
专用只读ILogger\u记录器;
私有只读用户管理器_UserManager;
公共索引模型(ILogger记录器、UserManager UserManager)
{
_记录器=记录器;
_userManager=userManager;
}
公共异步任务OnGetAsync()
{
var user=wait(u userManager.FindByIdAsync)(975c96e2-85a4-46ac-8211-53c8ebae0e87);;
如果(用户!=null)
{
var name=user.UserName;
}
}

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

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

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

这不起作用。它不会为用户名返回任何内容。我对代码做了一些更改,现在的问题是我需要执行多个OnGet操作。我有一个OnGetAsync,它获取posts表数据,然后我需要根据post结果中的用户ID获取用户。我想你是对的,你需要在OnGet中做更多的工作。U怀疑Model.Posts.Userid对于所有不起作用的Posts始终为空。它不会为用户名返回任何内容。我对代码做了一些更改,现在的问题是我需要执行多个OnGet操作。我有一个OnGetAsync,它获取posts表数据,然后我需要根据post结果中的用户ID获取用户。我想你是对的,你需要在OnGet中做更多的工作。U所有帖子的可疑Model.Posts.Userid始终为空