在Razor页面中访问Async属性

Qua*_*kly 5 c# async-await asp.net-core asp.net-core-2.0 razor-pages

我试图用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

页面也很简单:

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

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

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

Nko*_*osi 10

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

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

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

ASP.NET核心中Razor页面的参考介绍