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

ASP.NET Core模型变更无法在Razor前端显示问题求助

问题原因

你遇到的核心问题是异步操作的执行时机和方式错误:

  • 构造函数里调用了async void的LoadData方法,且未等待执行完成。构造函数本身无法支持异步执行,页面渲染流程不会等这个异步操作结束,因此前端渲染时telephone还是初始的"empty"值,等异步请求返回修改属性时,页面已经输出完毕。
  • async void在ASP.NET Core中属于不安全用法,这类方法脱离框架的异步跟踪,一旦抛出异常甚至会导致进程崩溃,除非是处理UI事件这类特殊场景,否则绝对不要使用。
解决方案

把异步数据加载逻辑移到页面模型的异步请求处理方法OnGetAsync中,同时修正LoadData的返回类型为Task:

修改后的后端代码

public class IndexModel : PageModel
{
    private readonly ILogger<IndexModel> _logger;

    public string telephone { get; set; } = "empty";
    public IndexModel(ILogger<IndexModel> logger)
    {
        _logger = logger;
        // 移除构造函数里的LoadData调用
    }

    // 将async void改为async Task
    private async Task LoadData()
    {
        var userService = new RemoteUserService();
        var test = await userService.GetItemByEmail("asd@asd.de");
        if (test != null)
        {
            telephone = test[0].Telephone;
        }
    }

    // 将OnGet改为异步的OnGetAsync
    public async Task OnGetAsync()
    {
        await LoadData();
    }
}

改动说明

  • ASP.NET Core Razor Pages的OnGetAsync是框架认可的异步请求入口,框架会等待该方法执行完毕再渲染页面,确保telephone在渲染前已经被更新。
  • async Task能让框架跟踪异步操作状态,异常也能被正确捕获处理,避免async void带来的各类隐患。
额外建议
  • 不要在构造函数中执行任何异步或耗时IO操作,构造函数只应做简单的依赖注入初始化。
  • 如果RemoteUserService是可注入的服务,建议通过构造函数注入,而非在方法内直接实例化,这样更符合依赖注入设计原则,也方便后续测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:15:18