Response.End terminating page events within a sharepoint page


I had a need to be able to present the user of a website with a prompt to open/save a pdf that had been dynamically generated based on inputs from the user during the completion of a form.
I wasn’t able to navigate away from the page where this option to download the pdf was presented to the user as i needed to remain within the context of the particular section within the form. Therefore the easiest way to provide the open/save option was through modifying the Page.Response as follows:

Page.Response.ContentType = “application/pdf”;

Page.Response.AddHeader(“content-disposition”, “attachment;filename=” + this.FormControl.FormDefinition.Name + “.pdf”);

Page.Response.Buffer =true;

Page.Response.Clear();

Page.Response.OutputStream.Write(PdfBuffer, 0, PdfBuffer.Length);

Page.Response.OutputStream.Flush();

Page.Response.Flush();

This worked fine, the user would click on a download button, the open/save box would pop up and the pdf would be streamed exactly as I wanted it. However, when they closed the open/save box and returned to the page with the download button on, none of the buttons on the page would work anymore, the page was effectively ‘dead’. The confusing part, was that if I used exactly same html, code etc on a page outside of SharePoint I didn’t have any problems at all. This was specifically related to pages hosted within SharePoint.

After digging around I found a comment buried down within a thread (http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/107b2c17-07fe-4a15-ad81-dcb31e1e9c84/#b5295204-c20a-4910-ab4b-d870ac09f687) where the following solution was proposed, and it works a treat:

In the page where your ‘download’ button resides, add the following code where you create the button control:

downloadButton.OnClientClick = “this.form.onsubmit = function() {return true;}”;

If using a LinkButton instead of a Button add the following instead:

exportButton .OnClientClick = “document.getElementsByTagName(\’form\’)[0].onsubmit = function() {return true;}”;

And everything then continues to work when you return to your page. The reason appears to be based on the fact that Sharepoint updates some kind of timestamp hash on the form before it is actually submitted to the server. This is done in order to prevent the form from being submit more than once if the user clicks before the Postback is completed, which is a good thing – except when trying to do what we are trying to do here.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s