当从ashx文件下载文件时,Asp:progress不会结束动画

4
我正在尝试使用asp:progress,以便在单击asp:button时调用ashx文件,并编写CSV响应。迄今为止,当我单击按钮时,动画正确显示并开始下载。但是,当文件开始下载(当我从ashx文件获取响应)时,似乎无法停止动画。以下是aspx代码:
<asp:Content ID="Content2" ContentPlaceHolderID="MainPlaceHolder" runat="server">
 <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
        <ContentTemplate>
            <p>Download a CSV file</p>
            <asp:Button ID="Button2" runat="server" Text="Download" 
            CausesValidation="False" onclick="Button2_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>

    <asp:UpdateProgress ID="UpdateProgress1"  AssociatedUpdatePanelID="UpdatePanel1" runat="server">
        <ProgressTemplate>
            <div id="AlertDiv" style="background:White">
                <asp:Image ID="imgLoading" runat="server" ImageUrl="css/smoothness/images/animated-overlay.gif" Width="34px" />Loading...
            </div>
        </ProgressTemplate>
    </asp:UpdateProgress>
</asp:Content>

这里是Button2_click函数:

protected void Button2_Click(object sender, EventArgs e)
{
    try
    {
        Response.Redirect("ProductsHierarchyDownload.ashx");
    }
    catch (Exception ex)
    {
      //log
    }
}

以下是来自ashx文件的ProcessRequest函数:
public void ProcessRequest(HttpContext context)
{
    string attachment = String.Format("attachment; filename=Hierarchie des produits au {0}.csv", DateTime.Today.ToShortDateString());
    context.Response.AddHeader("content-disposition", attachment);
    context.Response.ContentType = "text/csv";
    context.Response.AddHeader("Pragma", "public");
    context.Response.ContentEncoding = Encoding.GetEncoding(1252);
    context.Response.Write(DemandeTarifImageBLL.DataTableToCSVString());
}

我尝试过使用javascript和PageRequestManager类的endRequest、beginRequest和initializeRequest事件(我在这里找到了一些代码片段here),但迄今为止还没有任何作用。
当下载开始时,如何强制停止动画?

你试过我建议的更改了吗? - Shashank Chaturvedi
@ShashankChaturvedi 目前还没有运气。 - WizLiz
我不禁想到这是因为在您的按钮单击事件中触发了Response.Redirect。您是否尝试将ProcessRequest(ProcessRequest处理程序的函数)的内容移动到按钮单击事件中(并删除Response.Redirect)? - Shashank Chaturvedi
我已经更新了我的答案,请参考相同的内容。 - Shashank Chaturvedi
3个回答

1

虽然我没有尝试过检查它是否有效,但根据我的以往经验,我可以建议如下操作。尝试按以下方式更改您的代码:

public void ProcessRequest(HttpContext context)
{
    string attachment = String.Format("attachment; filename=Hierarchie des produits au {0}.csv",        
    DateTime.Today.ToShortDateString());
    context.Response.AddHeader("content-disposition", attachment);
    context.Response.ContentType = "text/csv";
    context.Response.AddHeader("Pragma", "public");
    context.Response.ContentEncoding = Encoding.GetEncoding(1252);
    context.Response.Write(DemandeTarifImageBLL.DataTableToCSVString());
    context.Response.Flush();
    context.Response.End();
}

添加Flush和End可以清除缓冲区并标记响应结束。这样客户端就能明确地得出请求已经完全处理的结论。
此外,您可以使用客户端脚本控制更新进度,以下是示例代码:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(EndRequest);

function EndRequest(sender, args) {
            if (postBackElement.id == 'Panel1Trigger') {
                $get('UpdateProgress1').style.display = 'none';
            }
        }

上述js代码添加了一个更新面板结束请求事件的处理程序,并在函数中关闭了更新进度。
尝试将您的手动程序的ProcessRequest函数内容放到按钮单击事件中,并记得为响应添加Flush()和End函数。
编辑1:
在进一步查看stackoverflow后,我找到了以下链接,其中包含与您类似的问题,并确认了我的假设,即您不能在更新面板内部进行重定向: asp:UpdateProgress never goes away after clicking on downloadable content inside a repeater 希望这有所帮助。

不幸的是,这并不会改变结果。动画开始>下载开始>下载完成后动画仍然停留在原地。 - WizLiz
我已经更新了我的答案,我认为这将解决你的问题。 - Shashank Chaturvedi
这是我尝试过的其中一件事,但我不明白为什么EndRequest似乎从未被调用(我在其中放置了一个警报,但它从未弹出)。我觉得response.redirect会结束客户端JavaScript的执行,我无法解决这个问题。 - WizLiz
你应该尝试将ProcessRequest函数的内容放到按钮单击事件中。并且记得为响应添加Flush()和End函数。 - Shashank Chaturvedi

1
尝试从 JavaScript 重定向到 ashx。
ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "downloadFileExport", "javascript:window.location ='" + ResolveUrl(downloadUrl) + "';", true)

这个也解决了我的问题。


0
在我的ASP.Net Web Forms应用程序中,即使进程已经完成,进度文本仍然显示。我能够通过增加ScriptManager中的超时时间来解决这个问题。以下是示例。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接