.NET Core Razor Pages:GetUsersInRoleAsync仅在.cshtml生效原因及代码差异咨询
嘿,我来帮你拆解这两个关于Razor Pages用户角色管理的问题,都是实际开发里很容易踩的坑:
问题1:
GetUsersInRoleAsync 仅在.cshtml中正常运行的原因 主要有这几个常见的诱因:
- 依赖注入没配对:你大概率在.cshtml里用了
@inject UserManager<ApplicationUser> UserManager直接拿到了正确的实例,但在Users.cshtml.cs的PageModel里,要么没注入UserManager,要么注入过程出了错(比如像你代码里那样,声明了字段却没给它赋值),导致调用时拿不到可用的UserManager实例。 - 异步处理没做对:
GetUsersInRoleAsync是异步方法,在PageModel里调用时如果没加await,或者没放在异步的生命周期方法(比如OnGetAsync)里执行,会返回一个未完成的Task而不是实际的用户列表,看起来就是“无法工作”;但在cshtml里,你可能直接写了@await UserManager.GetUsersInRoleAsync("Admin"),正确处理了异步逻辑,所以能正常返回结果。 - 执行时机不对:如果在PageModel的构造函数里尝试调用这个异步方法,那肯定会出问题——构造函数不能异步执行,而且此时请求上下文还没完全初始化,
UserManager无法正常工作。业务逻辑应该放在OnGetAsync这类页面生命周期方法里。
问题2:.cshtml与.cshtml.cs代码块的差异分析
先看你给出的Users.cshtml.cs代码片段:
public class UsersModel : PageModel { private UserManager<ApplicationUser> _userManager; public IList<ApplicationUser> admins { get; set; } public UsersModel(ApplicationDbContext dbContext) { _dbContext = dbContext; // 这里明显有问题:声明了_userManager但没注入,反而注入了dbContext } }
它和.cshtml里能正常运行的代码核心差异如下:
- 依赖注入完全错误:你在PageModel里声明了
_userManager字段,但构造函数注入的是ApplicationDbContext,根本没给_userManager赋值!这就导致后续调用_userManager.GetUsersInRoleAsync时,会触发空引用异常。而在.cshtml里,你应该是通过@inject正确拿到了UserManager的实例,所以能正常调用方法。 - 业务逻辑的执行时机错误:PageModel的构造函数不适合处理数据查询这类业务逻辑,尤其是异步操作。你应该把角色用户查询的逻辑放在异步的页面初始化方法里,比如
OnGetAsync。 - 正确的PageModel写法参考:
public class UsersModel : PageModel { private readonly UserManager<ApplicationUser> _userManager; // 遵循C#命名规范,用大写开头的属性 public IList<ApplicationUser> Admins { get; set; } // 正确注入UserManager public UsersModel(UserManager<ApplicationUser> userManager) { _userManager = userManager; } // 在异步生命周期方法里执行查询 public async Task OnGetAsync() { Admins = await _userManager.GetUsersInRoleAsync("Admin"); } }
简单来说,你的PageModel代码因为注入错误和执行时机不对,导致GetUsersInRoleAsync无法正常工作,而cshtml里的代码刚好避开了这些问题。
内容的提问来源于stack exchange,提问作者M. Douglas
相关产品推荐
相关产品推荐

