在 Razor 页面中访问异步属性

Posted

技术标签:

【中文标题】在 Razor 页面中访问异步属性【英文标题】:Accessing Async Property in Razor page 【发布时间】:2018-10-31 06:39:41 【问题描述】:

我正在尝试使用 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 交互?

【问题讨论】:

【参考方案1】:

那是因为async void,这基本上是一发不可收拾,应该避免。页面将在函数有时间完成之前加载,因为它们将并行执行。

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

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

参考Introduction to Razor Pages in ASP.NET Core

【讨论】:

以上是关于在 Razor 页面中访问异步属性的主要内容,如果未能解决你的问题,请参考以下文章

ajax的async属性(控制同步和异步)

ajax异步获得json对象后格式化时间

ajax同步与异步的区别

vue 异步组件 (按需加载)

ajax发送异步请求

script元素属性及引入方法