【问题标题】:Razor pages: How to wait for page´s model to load the info before presenting the web page剃刀页面:如何在呈现网页之前等待页面模型加载信息
【发布时间】:2021-10-13 18:20:24
【问题描述】:

我需要解决一个小问题。我正在构建一个网站,特别是一个页面(Razor pages 项目)让我们称之为“Results.cshtml”需要等待其页面模型(Results.cshtml.cs)在打印之前从 SQL 服务器收集信息.因此页面模型将在其“OnGet()”方法中执行所有查询。

问题是网页在页面模型接收到数据之前加载,并且我不断收到对象空引用异常(因为数据还不存在)。

如果我在网页中添加一个@Thread.Sleep(2000),那么它的渲染效果就很好,因为它给了 SQL 时间来发送信息。所以很明显,解决方案是想办法让页面等待模型收集数据。但是我没找到。

ModelPage 的 OnGet 方法:


public void OnGet()
        {
            GetPage();
        }
private async void GetPage()
        {
            Task<string> message = _pagesService.GetPagesByAuthorIDAsync("user01");

            var options = new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true };
            Pages = System.Text.Json.JsonSerializer.Deserialize< List<WebPage> >(await message, options);
        }

我需要属性:“Pages”在打印页面之前接收到数据。

页面如下所示:


@page
@model MyPageModel
@using System.Threading;

@{
    //Thread.Sleep(2000);
}


<div> @Model.Pages[0].Name </div>

非常感谢!

PD:出于某种奇怪的原因,它不允许我添加“大家好!”一开始。很奇怪,所以这里是“大家好!!”

【问题讨论】:

  • 这很不寻常。但是没有看到涉及的代码很难帮助你。
  • 我清理并添加了代码!
  • 您没有在等待数据。肯定在 async void 内,但是调用了 OnGet 方法,并且在 private async void GetPage() 完成之前完成。
  • 据我所知,您可以只使用 OnGet 异步:public async Task OnGet() 而不要使用 async void

标签: c# asp.net .net-core razor-pages


【解决方案1】:

您需要await async 方法,理想情况下返回Tasks,而不是void

public async Task OnGetAsync()
{
    await GetPage();
}
private async Task GetPage()
{
    Task<string> message = _pagesService.GetPagesByAuthorIDAsync("user01");

    var options = new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true };
    Pages = System.Text.Json.JsonSerializer.Deserialize< List<WebPage> >(await message, options);
}

【讨论】:

  • Razor 页面是否支持后缀 Async?这很好。
  • 是的 - 实际上,Async 后缀是可选的。它什么也不做。这只是一个约定。
  • 我希望如此 :),但 Mvc 不支持。至少在 .net core 3.1 及更早版本中没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多