首页 > 解决方案 > 在 Razor 页面中访问异步属性

问题描述

我正在尝试使用 Razor 页面构建一个简单的 .NET Core 2.0 Web 应用程序。该页面连接到一个同样简单的 Core 2.0 Web API。我有一个简单的课程:

public class About : PageModel
{
    private ServiceProxy serviceProxy;

    public About(ServiceProxy serviceProxy)
    {
        this.serviceProxy = serviceProxy;
    }

    public IEnumerable<ProductViewModel> Values { get; set; }

    public async void OnGetAsync()
    {
        this.Values = await this.serviceProxy.GetValuesAsync();
    }
}

页面也很简单:

@page
@model About
@{
    ViewData["Title"] = "About";
}
<h2>@ViewData["Title"]</h2>
<h3>@Model.Message</h3>
@foreach (var product in @Model.Values)
{
    <p>@product.Name</p>
}

但是,在OnGetAsync()方法可以填充“值”列表之前显示页面。这似乎是一个很常见的操作,但我找不到任何关于它的讨论(我也尝试过迭代异步“GetValues()”方法)。

CSHTML 页面应该如何与可能需要几秒钟才能返回结果的 Web API 交互?

标签: c#asp.net-coreasync-awaitasp.net-core-2.0razor-pages

解决方案


那是因为async void,这基本上是一个火灾和忘记,应该避免。该页面将在函数有时间完成之前加载,因为它们将并行执行。

将签名更改为,async Task以便页面可以等待操作完成。

public async Task<IActionResult> OnGetAsync() {
    this.Values = await this.serviceProxy.GetValuesAsync();
    return Page();
}

参考ASP.NET Core 中 Razor 页面介绍


推荐阅读