Asp:progress won't end anitmation when file is downloaded from ashx file

强颜欢笑 提交于 2019-12-10 17:39:14

问题


Im trying to use an asp:progress so when I click on my asp:button it calls an ashx file which write a CSV response.

So far when I click on the button, the animation shows properly and the download start. However I can't seem to stop the animation when the file start downloading (when I get the response from the ashx file).

Here is the 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>

Here is the Button2_click function :

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

And here is the ProcessRequest function from the ashx file :

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());
}

I've tried to use javascript and the property endRequest, beginRequest and initializeRequest event of the PageRequestManager Class (I found some conde snippet here) but nothing has worked for me so far.

How do I force the animation to stop when the download starts ?


回答1:


Although I was not able to try and see if its working but by my previous experience I can suggest the following. Try changing your code as follows:

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();
}

Adding Flush and End clears the buffer and marks the response end respectively. This way the client would reach a definite conclusion that the Request has been completely processed.

Also you can control the update progress with the client side script, here is a sample code:

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(EndRequest);

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

The above js code adds an handler for update panels end request event and on the function closes the Update progress.

Try putting the contents of you ProcessRequest function of your handeler to the button click event, and do remember to add Flush() and End function for the response.

EDIT 1:

On looking further in stack overflow I found the following link with the issue similar to yours, and this confirmed my assumption that you can not have a redirect inside an update panel:

asp:UpdateProgress never goes away after clicking on downloadable content inside a repeater

Hope this helps.




回答2:


Try redirect to ashx from javascript.

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

This was solved my issue too.




回答3:


In my ASP.Net Web Forms application the progress text kept showing even after the process was done. I was able to fix that in Dev environment by increasing the timeout in the ScriptManager. Example below.



来源:https://stackoverflow.com/questions/21905425/aspprogress-wont-end-anitmation-when-file-is-downloaded-from-ashx-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!