当我的OnGetAsync正在处理的时候,我正在试着展示一个旋转器.

我有一个类似于以下内容的表单:

<form method="get">
    <div class="row">
        <button type="submit" class="btn btn-primary" name="action" value="1">1</button>
        <button type="submit" class="btn btn-primary" name="action" value="2">2</button>
    </div>
</form>

我已经能够通过添加一个onClick来触发jQuery.show()方法,从而在按下按钮时显示我的微调按钮.然而,当我的OnGetAsync美元回来时,我没有好的方法来阻止它.

处理这类事情的正确方法是什么?


更新的示例:

<form method="get">
    <div class="row">
        <button id="pdfbutton" type="submit" class="btn btn-primary" name="action" value="PDF">PDF</button> *@
        <span id="spinner" class="loader" style="display:none;"></span>
    </div>
</form>


@section Scripts{
    <script>
        $("#pdfbutton").click(function(){
            $("#spinner").show();
        });
    </script>
}

public class IndexModel : PageModel
{
    public Task<IActionResult> OnGetAsync(string? action)
    {
        if (action == "PDF") {
            var file = await File.ReadAllBytesAsync(<path to some pdf file>);
            return File(file, "application/pdf", "file.pdf");
        }
        return Page();
    }
}

推荐答案

在Razor项目中,C#不能在客户端运行,这里有另外similar issue个提到过这个问题,所以我们最好控制加载是否显示.由于您没有提供最低限度的样本,所以我有一个带有以下代码的测试:

<form method="get">
    <div class="row">
        @* <button type="submit" class="btn btn-primary" name="action" value="1">1</button>
        <button type="submit" class="btn btn-primary" name="action" value="2">2</button> *@
        <button id="showImg">show loading</button>
    </div>
</form>

<div id="loadImg" style="display:none;">
    <img style="width:50px;height:50px;" src="~/loading.gif" />
</div>

@section Scripts{
    <script>
        $("#showImg").click(function(){
            $("#loadImg").show();
        });
    </script>
}

public class IndexModel : PageModel
{
    public IActionResult OnGet()
    {
        return Page();
    }
}

这是测试结果.

enter image description here

由于我在方法中有一个return Page(),每次调用onGet时,整个页面都会重新加载,这样我的加载图标就会变成默认的不可见.如果我们想像aecom一样重新加载页面的一部分,那么所有这些都应该由js控制.例如,在onclick事件中,我们可能会发送一个allocate请求,在发送请求之前,我们可以调用.show()方法来显示加载图标,而在回调方法中,我们可以调用.hide()方法使其不可见.

=UPDATE=

我们现在面临的问题是找到一个触发器来让页面知道表单提交已经完成,而我们实际上没有这样的回调方法,所以我找到了一个在此场景中起作用的解决方法.

$([window, top.window]).blur(function () {
    $("#loadImg").hide();
});

enter image description here

顺便说一句,我try 将文件与页面一起返回,以便页面重新加载并隐藏加载图标,但事实证明这是不可能的.我还试图定义一个变量,但razor Pages不像razor组件,因此我们无法监视变量以判断提交是否完成.我认为另一种可能的方式是,我们手动提交表单/通过Java脚本下载文件,这样我们就可以控制图标在文件下载过程中显示或不显示.例如,我们可以有这样的代码,这使得我们不能在文件返回时隐藏图标,但我相信如果我们总是试图返回一个小文件,那么1到2秒就足够了.

$("#showImg2").click(function(){
    $("#loadImg").show();
    downloadUrl("/?action=PDF");
    setTimeout(hideImg, 2000);
});

function hideImg() { 
    $("#loadImg").hide();
}

enter image description here

Csharp相关问答推荐

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

LINQ无法翻译SQLFunctions方法

数组被内部函数租用时,如何将数组返回给ArrayPool?

Unity中的刚体2D运动

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

为什么在使用动态obj+类obj时会调用串联?

调用Task.Run()与DoSomethingAsync()有什么不同?

如何将FindAll()与Nuget包Interop.UIAutomationClient一起使用

.NET 8在appsettings.json中核心使用词典URI、URI&>

C#LINQ子字符串

为什么我的用户界面对象移动到略低于实际目标?

我的命名管道在第一次连接后工作正常,但后来我得到了System.ObjectDisposedException:无法访问关闭的管道

如何在特定环境中运行dotnet测试?

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

try 创建一个C#程序,该程序使用自动实现的属性、覆盖ToString()并使用子类

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

有没有更好的方法来使用LINQ获取整行的计算组

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值

C# -根据列表所包含的值的数量组织列表- C#