Post Back does not work after writing files to response in ASP.NET

What I have?

I have an ASP.NET page which allows the user to download file a on a button click. User can select the file he wants from a list of available files (RadioButtonList) and clicks on download button to download it. (I should not provide link for each file that can be downloaded - this is the requirement).

What do I want?

I want the user to download multiple files one by one by selecting the required radio button and clicking on the button.

What problem am I facing?

I can download the file for the first time properly. But, after downloading, if I select some other file and click on the button to download it, click event of the button does not post back and the second file will not be downloaded.

I use the following code on the button click event:

protected void btnDownload_Click(object sender, EventArgs e)
{
    string viewXml = exporter.Export();
    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
    Response.AddHeader("Content-Length", viewXml.Length.ToString());
    Response.ContentType = "text/plain";
    Response.Write(viewXml);
    Response.End();
}

Am I doing something wrong here?

Same problem can be replicated in IE6, IE7 and Chrome. I think this problem is browser independent.

I had this same issue with sharepoint. I have a button on the page that sends a file and after clicking the button, the rest of the form was unresponsive. Turns out it is a sharepoint thing that sets the variable _spFormOnSubmitCalled to true to prevent any further submits. When we send a file this doesn't refresh the page so we need to manually set this variable back to false.

On your button in the webpart set the OnClientClick to a function in your javascript for the page.

 <asp:Button ID="generateExcel" runat="server" Text="Export Excel" 
OnClick="generateExcel_Click" CssClass="rptSubmitButton"
OnClientClick="javascript:setFormSubmitToFalse()" />

Then in the javascript I have this function.

function setFormSubmitToFalse() {
    setTimeout(function () { _spFormOnSubmitCalled = false; }, 3000);
    return true;
}

The 3 second pause I found was necessary because otherwise I was setting the variable before sharepoint set it. This way I let sharepoint set it normally then I set it back to false right after.

Post Back does not work after writing files to response in ASP.NET , But the postback does not happen after calling response.end(); Is there a /post-​back-does-not-work-after-writing-files-to-response-in-asp-net. When sending a file to client and using response.write in ASP.Net the developer is unable to do anything else after the file is sent. There are other work-arounds like adding a javascript onclick function that would call a function after the client gets the file, which is similar to adding a meta refresh to the…

Offhand, what you're doing should work. I've successfully done similar in the past, although I used a repeater and LinkButtons.

The only thing I can see that's different is that you're using Response.Write() rather than Response.OutputStream.Write(), and that you're writing text rather than binary, but given the ContentType you specified, it shouldn't be a problem. Additionally, I call Response.ClearHeaders() before sending info, and Response.Flush() afterward (before my call to Response.End()).

If it will help, here's a sanitized version of what works well for me:

// called by click handler after obtaining the correct MyFileInfo class.
private void DownloadFile(MyFileInfo file) 
{
    Response.Clear();
    Response.ClearHeaders();
    Response.ContentType = "application/file";
    Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
    Response.AddHeader("Content-Length", file.FileSize.ToString());
    Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
    Response.Flush();
    Response.End();        
}

You may want to consider transferring the file in a binary way, perhaps by calling System.Text.Encoding.ASCII.GetBytes(viewXml); and passing the result of that to Response.OutputStream.Write().

Modifying your code slightly:

protected void btnDownload_Click(object sender, EventArgs e)
{
    string viewXml = exporter.Export();
    byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml); 
    // NOTE: you should use whatever encoding your XML file is set for.
    // Alternatives:
    // byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml);
    // byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml);

    Response.Clear();
    Response.ClearHeaders();
    Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
    Response.AddHeader("Content-Length", bytes.Length.ToString());
    Response.ContentType = "application/file";
    Response.OutputStream.Write(bytes, 0, bytes.Length);
    Response.Flush();
    Response.End();
}

How to do a postback after file download, What I have? I have an ASP.NET page which allows the user to download file a on a button click. User can select the file he wants from a list of available files  Remove Response.End() and let the response end naturally within the ASP.NET ecosystem. If that does not work, I would recommend putting the button in a separate <form> and post the required data to a separate HTTP handler. Setup the HTTP handler to export the XML instead of a web page.

A simple way to do this without removing Response.End is to add client-side js to do the page refresh. Add the js to your button's onclientclick property.

e.g.

    onclientclick="timedRefresh(2000)"

then in your html..

    <script type="text/JavaScript">
    <!--
    function timedRefresh(timeoutPeriod) {
        setTimeout("location.reload(true);",timeoutPeriod);
    }
    //   -->

How to Post Back does not work after writing files to response in , What I have? I have an ASP.NET page which allows the user to download file a on a button click. User can select the file he wants from a list of  the after you finish your code at the end call this button event as follows: button1_Click(null, null); ex: as you say if user select open then the file will be opened and then a post back happen ok at the end of this code (and the file opened)call the empty functioneasy regard

Remove Response.End() and let the response end naturally within the ASP.NET ecosystem.

If that does not work, I would recommend putting the button in a separate <form> and post the required data to a separate HTTP handler. Setup the HTTP handler to export the XML instead of a web page.

How to do postback after downloading File using Response , ASP.NET. I am using Response.WriteFile method for downloading an excel sheet from a the after you finish your code at the end call this button event ex: as you say if user select open then the file will be opened and then a post back happen ok at the end of this i have a same problem plz help me a postback is an HTTP POST to the same page that the form is on. While the article does explain how a second page was needed in ASP, but no longer needed in ASP.NET, it doesn't give much detail or background. I am looking for a freakin' tome of information on PostBacks.

I had same problem. Function to perform simple Response.Writer("") on Button Click event on aspx page was never firing.

Method in class:

public test_class()
{
    public test_class() { }

    public static void test_response_write(string test_string) 
    {
        HttpContext context = HttpContext.Current;
        context.Response.Clear();
        context.Response.Write(test_string);
        context.Response.End();                   
    }
}

ASPX Page:

protected void btn_test_Click(object sender, EventArgs e)
{
    test_class.test_response_write("testing....");
}

While I was trying to find the reason, I just called same function on Page_Load event it worked.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        test_class.test_response_write("testing....");
    }
}

Investigating the issue I found out that Master Page of that aspx page's body was under <asp:UpdatePanel>.

I removed it, and it worked on Button_Click Event. I would recommend you to check that too.

After file added to response, post back stops working in WebPart, The problem is that once a file has been added to the page response For instance, if I press a button that is supposed to do a post back nothing happens. /2007/01/19/using-asp-net-ajax-with-sharepoint-moss-2007.aspx. But Response.redirect is not working. Now go to design view select the button which you want to set Response.redirect and press F4 that will open Button Properties then you need to find PostBackUrl option and then locate your URL that you want.

ASP.NET Postback after response.write [Work-around Solution , Net the developer is unable to do anything else after the file is sent. ASP.NET Postback after response.write [Work-around Solution] 'this spot is not be executed after a form submit (postback); which means you can put. You can not use include files that are aspx pages in ASP.Net. The reason is that the pages are compiled and run before being sent to the client.

Problem with postback after Response.Write - ASP.NET, BinaryWrite (buf); // Write binary data. Response.End (); } This works fine. But my problem is that after the browser puts up the. File Download  In this article I will provide solution to the problem: - JavaScript not working in UpdatePanel after PostBack in ASP.Net. Cause All jQuery plugins are applied on the Page Load event of the HTML Page or in other words document ready event which is fired when the whole page or document is rendered completely in browser.

Response.WriteFile problem - Modules - DNN Software, AddHeader("Content-Disposition", "attachment; filename=file.csv") note: The code is called during a postback, after the user clicks a I tried the exact same code outside a dnn module, in a "testfile.aspx" page, and everything works fine. response.end() just after the response.binary.write(), but nothing  ASP.NET works with the Response buffer. The best approach is to pass in each separate string. This is faster, uses less memory, and even simpler to read. I noted a performance degradation when not calling ToString on the ints. Note: I have not carefully investigated this. Response.Write may have slower code for ints.

Comments
  • If you are on an Ajax enabled form (or control) it can be that the Ajax javascript is mixed up or blocked since you returned a different document instead of returning what Javascript was expecting (some viewstate info plus updated html that goes into the updatepanel). See also social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/…
  • I knew this tidbit of information in the past, but I completely forgot. Thank you for saving me hours by reminding me.
  • worked like a charm for my sharepoint document library > document download issue. Three cheers!!!
  • Thanks, Randolpho. No luck with the altered code also. It is behaving the same :(
  • Hmm... well, I'm stumped. Like I said, what I have works fine. Is it possible it's something you do in your code before the click handler is called? If you can, try posting the entire page and code-behind.
  • The Response.ClearHeaders() seemed to be critical in my case. Thanks Randolpho.
  • Initially I had not included Response.End(). It was not working then as well!
  • Hmmm. Well, maybe you can try putting the button in a separate <form> and post the required data to a separate HTTP handler that is setup to export the XML?
  • Also, you should specify a content encoding like Response.ContentEncoding = Encoding.UTF8
  • Josh, thanks for the suggestion. I could achieve the task using HTTP Handler. Can you please put that as an answer so that I can mark it?