为什么GetUsersInRoleAsync方法仅适用于.cshtml?

时间:2018-04-30 13:46:55

标签: c# asp.net

我正在开发一个Web应用程序(带有Razor页面的.NET Core,而不是mvc和单独的用户帐户),我需要向用户显示相应的角色。

任何人都可以解释一下以下代码块之间的区别:

使用Users.cshtml.cs

不起作用
public class UsersModel : PageModel
{
    private UserManager<ApplicationUser> _userManager;
    public IList<ApplicationUser> admins { get; set; }

    public UsersModel(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async void OnGet()
    {
        admins = _userManager.GetUsersInRoleAsync("Admins").Result;
    }
 }

加载页面时崩溃并产生错误。

使用Users.cshtml

@page
@model UsersModel
@inject UserManager<ApplicationUser> _userManager
@{
 var admins = _userManager.GetUsersInRoleAsync("Admins").Result;
}

@foreach(var user in @Model.admins)
{
    <h3>@user</h3>
}

因此,第一个(不工作)代码块中没有语法错误。当我运行代码时,我收到'Object reference not set to an instance of an object.'在将此帖标记为重复之前,我不是在寻找有关修复此特定错误的答案。

我想知道是否有人能告诉我.cshtml-version和.cs-version之间的区别?我想使用.cshtml.cs版本,因为它更清晰。

编辑1

// not this
public UserManager<ApplicationUser> _userManager;

// but this
var _userManager serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();

1 个答案:

答案 0 :(得分:2)

_userManager在您的cs版本中为null,因为您没有将其作为依赖项注入。

在您为@inject提供的该对象指定的剃刀版本中。

您需要在cs版本中添加构造函数并注入_userManager依赖项,但是您使用的框架会执行它。

通常看起来像这样:

private readonly IUserManager<IApplicationUser> _userManager;

public UsersModel(
    IUserManager<IApplicationUser> userManager) {
    _userManager = userManager;
}

注入的依赖项通常在接口级别工作,而不是具体的类型级别。如果您必须更改某些内容的具体实现,这将避免以后的大量代码重构。