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

Razor Page的OnGet使用async/await会导致控件加载不稳定吗?

问题根源与解决方法

你的问题根本原因不是async/await从数据库取数据不合适,而是Razor Page的异步OnGet方法误用了async void返回类型。

为什么会出现加载不稳定

ASP.NET Core无法跟踪返回void的异步方法执行状态,当你用async void OnGet时,框架不会等待方法内的异步操作(比如数据库查询)完成就开始渲染页面。这就导致了竞态条件:

  • 当数据库查询速度快时,RoleList在页面渲染前已经赋值,MultiSelect能正常加载选项;
  • 当查询速度慢时,页面渲染时RoleList还未被赋值,MultiSelect就会显示空选项列表。

同步方法不存在这个问题,因为同步代码会阻塞到所有数据加载完成后才开始渲染页面。

解决方法:修改OnGet的返回类型为Task

Razor Page的异步处理方法必须返回Task,框架会等待该Task完成后再渲染页面。修改你的异步OnGet方法:

public async Task OnGet(int securityGroupId)
{
    if (securityGroupId == -1)
    {
        SecurityGroup = new SecurityGroup();
        SecurityGroup.IsActive = true;
    }
    else
    {
        SecurityGroup = await DL.GetEntityByIdAsync<SecurityGroup, int>(securityGroupId);
    }

    RoleList = await DL.GetLookupListAsync<Role>();
    RoleList = RoleList.OrderBy(r => r.Text).ToList();
}

额外验证点

你的数据库异步方法(GetEntityByIdAsync、GetLookupListAsync)实现是正确的,返回Task<T>类型且正确使用了await,不需要修改。

内容的提问来源于stack exchange,提问作者Legion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:42:43