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 事件(我在这里找到了一些 conde 片段),但到目前为止对我没有任何帮助。

下载开始时如何强制动画停止?

4

3 回答 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:

在进一步查看堆栈溢出时,我发现以下链接与您的问题类似,这证实了我的假设,即您不能在更新面板中进行重定向:

asp:UpdateProgress 在单击转发器内的可下载内容后永远不会消失

希望这可以帮助。

于 2014-02-24T10:40:29.083 回答
1

尝试从 javascript 重定向到 ashx。

ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "downloadFileExport", "javascript:window.location ='" + ResolveUrl(downloadUrl) + "';", true)

这也解决了我的问题。

于 2014-12-18T10:51:45.253 回答
0

在我的 ASP.Net Web Forms 应用程序中,即使在进程完成后,进度文本也会继续显示。通过增加 ScriptManager 中的超时,我能够在开发环境中解决这个问题。下面的例子。

在此处输入图像描述

于 2015-07-02T19:50:29.283 回答