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とどのように相互作用することになっていますか?
これは、async void
が原因です。これは基本的に火事であり、忘れてしまうため、避ける必要があります。ページは並行して実行されるため、関数が完了する前にロードされます。
署名をasync Task
に変更して、ページがアクションの完了を待つことができるようにします。
public async Task<IActionResult> OnGetAsync() {
this.Values = await this.serviceProxy.GetValuesAsync();
return Page();
}