Доступ к Async Property на странице Razor - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь вызвать простое веб-приложение .NET Core 2.0 со страницами Razor.Страница связана с одинаково простым 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 должны взаимодействовать с веб-API, для возврата результатов которого может потребоваться несколько секунд?

1 Ответ

0 голосов
/ 21 мая 2018

Это из-за async void, который по сути является огнем и забыл, и его следует избегать.Страница будет загружена до того, как функция успеет завершиться, поскольку они будут выполняться параллельно.

Измените подпись на async Task, чтобы страница могла ожидать завершения действия.

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

Ссылка Введение в бритвенные страницы в ASP.NET Core

...