HoTTab1CH HoTTab1CH - 1 month ago 20
ASP.NET (C#) Question

How to fix freezing page after file download?(TransmitFile in TreeView SelectedNodeChanged)

So I know that this is common problem, page freezes (any buttons visually are clickable but doesn't perform any action) because it doesn't close some request after file download.

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "text/txt";
response.AddHeader("Content-Disposition", "attachment; filename=" + TreeView1.SelectedNode.Text + ";");
response.TransmitFile(TreeView1.SelectedNode.Value);
response.Flush();
response.Close();
HttpContext.Current.ApplicationInstance.CompleteRequest();


This code is in TreeView
SelectedNodeChanged
event, and this is a problem.

For example if will put that transmit code in some button, I can fix freezing of page by adding
OnClientClick="javascript:setFormSubmitToFalse()"
to the button and this small JavaScript fixes page freezing after download.

<script type="text/javascript">
//Fix page freeze after download dialog
function setFormSubmitToFalse() {
setTimeout(function () { _spFormOnSubmitCalled = false; }, 3000);
return true;
}
</script>


But I don't know how to fix this if I'm clicking on TreeView node. TreeView doesn't have
OnClientClick
, I also tried to run that JS function from code behind right before and after transmit code
Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "setFormSubmitToFalse()", true);
but it doesn't help, page is still freezing after file download.

Any ideas how can I fix this? Thanks.

This is webpart (almost asp.net page) on sharepoint site.

Edit:

I'll try to explain better my situation and what I'm trying to achive.

So my main goal: There is a shared folder with documents in local network, users that will be using this app should not have access to this shared folder, only entity that is running App pool has access to it.

I am making some SQL request that gives me path of some subfolder. I am building treeview of that subfolder and when user clicks on some file in treeview SelectedNodeChanged event shots and I perform transmitting file as app pool identity

SPSecurity.RunWithElevatedPrivileges(delegate()
{
/* transmit file code */
});


Everything is working fine but if I understand right, something on CLIENT side probably freezes page after TransmitFile shoots and prevents from sending any other post request to server, that's why my little JS solution worked when it was performed OnClientClick.

This is original how author of that fix explained that, but I don't know how to implement this into treeview http://stackoverflow.com/a/17186011/5805492

Answer

So solution was pretty simple but a little bit tricky.

Nodes doesn't have onClientClick event, but we can add JS click event to any page element, right? So here is the trick, when creating TreeView just add click to actual text of the node with help of Span:

...
TreeNode fileNode = new TreeNode
 {
     //before
     //Text = file.Name,
     //after
     Text = "<span onclick=\"javascript:setFormSubmitToFalse();\">"+file.Name+"</span>",
     Value = file.FullName,
 };
...

And in transmitting file parse text of the node to have normal name of the file:

response.AddHeader("Content-Disposition", "attachment; filename=" + 
    TreeView1.SelectedNode.Text.Replace("<span onclick=\"javascript:setFormSubmitToFalse();\">", string.Empty).Replace("</span>", string.Empty) + ";");

Now everything is working and page is not freezing anymore after downloading.