C# asp.net核心剃须刀页面';加载指示器';

C# asp.net核心剃须刀页面';加载指示器';,c#,razor,asp.net-core,razor-pages,C#,Razor,Asp.net Core,Razor Pages,一般来说,我对web开发是新手,所以我怀疑我误解了razor页面的核心前提 我试图在提取数据时向页面添加加载指示器。 虽然这可以通过js承诺来实现,但我假设我可以完全用c#和cshtml文件来实现 在我的控制器中,我有一个页面模型,如下所示: public Boolean IsLoading { get; set; } = true; public async Task<IActionResult> OnGetAsync() { await Task.Run(() =>

一般来说,我对web开发是新手,所以我怀疑我误解了razor页面的核心前提

我试图在提取数据时向页面添加加载指示器。 虽然这可以通过js承诺来实现,但我假设我可以完全用c#和cshtml文件来实现

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

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

public async Task<IActionResult> OnGetAsync()
{
    await Task.Run(() =>
    {
        Thread.Sleep(1000 * 10);
        IsLoading = false;
    });
    return Page();
}
publicbooleanisloading{get;set;}=true;
公共异步任务OnGetAsync()
{
等待任务。运行(()=>
{
线程。睡眠(1000*10);
IsLoading=false;
});
返回页();
}
只是用来模拟一个昂贵的数据库查询,以及一个bool来指示加载何时完成

在我的页面文件中,我有如下内容:

@if (@Model.IsLoading)
{
    <div>
        <img src="~/Images/loading.gif" />
    </div>
}
else
{
    <div>
        <<Some Code Showing My Data>>
    </div>
}
@if(@Model.isload)
{
}
其他的
{
}
我尝试了多种方法来尝试更新模型,或者在数据提取完成后重新绘制页面,但是我找不到任何有效的方法

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


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

除非您正在使用或类似的酷炫技术,否则aspnet land中的规则是“Javascript在客户端上运行。Dotnet/C#在服务器上运行”。也可以查看ADyson的评论。

通常,如果
IsLoading
属性为
true
您应该会看到加载图像。您之所以看不到它,是因为
IsLoading
从来都不是
true
。这是因为您使用的是
wait
关键字。通过使用它,这部分代码:
returnpage()仅在任务完成后到达。因此,当返回
页面
对象时,
IsLoading
属性为
false


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

您必须记住:Razor=>服务器端代码。一旦你在浏览器中看到页面,Razor就不存在了,你的所有逻辑都已经运行了。为了回应Camilo所说的,所有的C#代码都在服务器上运行,用于构建一些静态HTML,然后发送到浏览器。浏览器无法运行C#,并且不会向浏览器发送任何C#代码。浏览器将只等待HTML被交付。因此,在此上下文中长时间运行的DB查询只会导致页面加载时间延长。为了让您的想法发挥作用,您需要加载页面的框架,然后使用JS向单独的URL发出AJAX请求,该URL将运行长时间运行的查询并返回结果。在请求开始和结束时,使用JS显示/隐藏加载指示器