web-dev-qa-db-ja.com

Razorページで非同期プロパティにアクセスする

Razorページを使用して単純な.NETCore 2.0Webアプリケーションを起動しようとしています。このページは、同様に単純なCore 2.0 WebAPIに接続されています。私は簡単なクラスを持っています:

_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とどのように相互作用することになっていますか?

7
Quarkly

これは、async voidが原因です。これは基本的に火事であり、忘れてしまうため、避ける必要があります。ページは並行して実行されるため、関数が完了する前にロードされます。

署名をasync Taskに変更して、ページがアクションの完了を待つことができるようにします。

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

参照 ASP.NET CoreのRazorページの概要

11
Nkosi