我正在开发一个Web应用程序(带有Razor页面的.NET Core,而不是mvc和单独的用户帐户),我需要向用户显示相应的角色。
任何人都可以解释一下以下代码块之间的区别:
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;
}
}
加载页面时崩溃并产生错误。
@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版本,因为它更清晰。
// not this
public UserManager<ApplicationUser> _userManager;
// but this
var _userManager serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
答案 0 :(得分:2)
_userManager
在您的cs版本中为null,因为您没有将其作为依赖项注入。
在您为@inject提供的该对象指定的剃刀版本中。
您需要在cs版本中添加构造函数并注入_userManager依赖项,但是您使用的框架会执行它。
通常看起来像这样:
private readonly IUserManager<IApplicationUser> _userManager;
public UsersModel(
IUserManager<IApplicationUser> userManager) {
_userManager = userManager;
}
注入的依赖项通常在接口级别工作,而不是具体的类型级别。如果您必须更改某些内容的具体实现,这将避免以后的大量代码重构。