visual control c# asp.net sharepoint treeview web-parts

c# - control - ¿Cómo arreglar la página de congelación después de la descarga del archivo?(TransmitFile en TreeView SelectedNodeChanged)



treeview control (2)

Así que sé que este es un problema común, la página se congela (se puede hacer clic en los botones visualmente pero no realiza ninguna acción) porque no cierra alguna solicitud después de la descarga del archivo.

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

Este código está en evento TreeView SelectedNodeChanged , y esto es un problema.

Por ejemplo, si pondré ese código de transmisión en algún botón, puedo arreglar el congelamiento de la página agregando OnClientClick="javascript:setFormSubmitToFalse()" al botón y esta pequeña página de arreglos de JavaScript congela después de la descarga.

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

Pero no sé cómo solucionarlo si hago clic en el nodo TreeView. TreeView no tiene OnClientClick , también intenté ejecutar esa función JS desde código justo antes y después de transmitir el código Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "setFormSubmitToFalse()", true); pero no ayuda, la página sigue congelada después de la descarga del archivo.

¿Alguna idea de cómo puedo solucionar esto? Gracias.

Esto es webpart (página casi asp.net) en el sitio sharepoint.

Editar:

Trataré de explicar mejor mi situación y lo que intento lograr.

Entonces mi objetivo principal: hay una carpeta compartida con documentos en la red local, los usuarios que utilizarán esta aplicación no deberían tener acceso a esta carpeta compartida, solo la entidad que ejecuta el grupo de aplicaciones tiene acceso a ella.

Estoy haciendo una solicitud SQL que me da la ruta de alguna subcarpeta. Estoy construyendo treeview de esa subcarpeta y cuando el usuario hace clic en algún archivo en vista de árbol SelectedNodeChanged se disparan los eventos y yo realizo la transmisión del archivo como la identidad del grupo de aplicaciones

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

Todo funciona bien, pero si entiendo bien, algo del lado del CLIENTE probablemente congele la página después de que TransmitFile robe e impide enviar cualquier otra solicitud al servidor, por eso mi pequeña solución JS funcionó cuando se realizó OnClientClick.

Esto es original, como lo explicó el autor de esa solución, pero no sé cómo implementar esto en treeview https://stackoverflow.com/a/17186011/5805492


Entonces la solución fue bastante simple pero un poco complicada.

Los nodos no tienen el evento onClientClick, pero podemos agregar el evento de clic de JS a cualquier elemento de página, ¿verdad? Así que este es el truco, cuando se crea TreeView simplemente agrega clic al texto real del nodo con la ayuda de Span:

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

Y al transmitir el texto de análisis del archivo del nodo para tener el nombre normal del archivo:

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

Ahora todo está funcionando y la página ya no se congela después de la descarga.


No estoy seguro de entender realmente su situación, pero es probable que su aplicación esté congelada debido a que el hilo de la interfaz de usuario está bloqueado en el código que está intentando ejecutar de forma síncrona.

Para evitar que esto ocurra, debe ejecutar la lógica de forma asincrónica.

public async void OnSelectedNodeChanged(object sender, EventArgs e) { await Task.Run(() => { 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(); }).ConfigureAwait(false); }

Este es un método de vacío asíncrono, lo que significa que el código que dispara este evento no esperará a que termine, ni sabrá cuándo ha terminado.

Esto evitará que el hilo bloquee su IU, pero si el usuario tiene la capacidad de "disparar rápidamente" estos eventos al hacer clic alrededor de su UI, puede no ser conveniente escribir el código de esta manera.

De todos modos, es probable que necesite alguna forma de lógica asíncrona para lograr lo que está buscando.