You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:48