asp.net core 剃刀页面“加载指示器”

MJa*_*Jac 7 c# razor asp.net-core razor-pages

一般来说,我是网络开发的新手,所以我怀疑我误解了剃刀页面的核心前提。

我正在尝试在提取数据时向页面添加加载指示器。虽然这可以通过 js Promise 来实现,但我假设我可以使用 cshtml 文件完全在 C# 中完成此操作。

在我的控制器中,我有一个页面模型,如下所示:

public Boolean IsLoading { get; set; } = true;

public async Task<IActionResult> OnGetAsync()
{
    await Task.Run(() =>
    {
        Thread.Sleep(1000 * 10);
        IsLoading = false;
    });
    return Page();
}
Run Code Online (Sandbox Code Playgroud)

只是用来模拟昂贵的数据库查询,以及一个布尔值来指示加载何时完成。

在我的页面文件中,我有类似这样的内容:

@if (@Model.IsLoading)
{
    <div>
        <img src="~/Images/loading.gif" />
    </div>
}
else
{
    <div>
        <<Some Code Showing My Data>>
    </div>
}
Run Code Online (Sandbox Code Playgroud)

我尝试了多种方法来尝试更新模型或在数据拉取完成后重新绘制页面,但我一直无法找到任何有效的方法。

所需的行为是让页面显示加载符号,直到“数据库查询”完成,然后显示数据。

我看到的当前行为是,在“数据库查询”完成之前,页面不会百分比。所以我从来没有看到加载gif。

End*_*ani 2

通常,如果IsLoading属性是,true您应该看到加载图像。你看不到它的原因是因为IsLoading永远不会true。发生这种情况是因为您使用了await关键字。通过使用它,这部分代码:return Page();仅在任务完成后才到达。所以当Page对象返回时,IsLoading属性是false

另外,重申@LosManos 的回答,C# 无法在客户端上执行。因此,即使显示图像,您仍然需要 JavaScript 来查询服务器以检查作业是否已完成并隐藏图像。