代码之家  ›  专栏  ›  技术社区  ›  Quark Soup

在Razor页面中访问异步属性

  •  11
  • Quark Soup  · 技术社区  · 7 年前

    我想提出一个简单的解决办法。NET Core 2.0 Web应用程序,带有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页面应该如何与可能需要几秒钟才能返回结果的Web API交互?

    1 回复  |  直到 7 年前
        1
  •  17
  •   Nkosi    7 年前

    那是因为 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