Problemas con eventos en MOSS/WSS

En algunas ocasiones, necesitamos generar un fichero (por ejemplo, zip con adjuntos de elementos de las listas, un pdf…)  cuando se pulsa un botón. En mi caso, se trataba de obtener un fichero comprimido con los adjuntos de los elementos que se muestran como resultado de la búsqueda, para una única página. Realice múltiples pruebas y siempre funcionaba todo correctamente hasta que añadí el webpart a SharePoint. En ese momento, comenzó a suceder una cosas muy rara: únicamente podía pulsar una vez el botón. Cuando me devolvía el fichero, el resto de la página no respondía a los eventos. Realice pruebas de nuevo con el mismo webpart fuera de SharePoint y todo funcionaba correctamente.

Este problema se debe a que cuando se envía el formulario, se llama a la función WebForm_OnSubmit y desde ahí a la función _spFormOnSubmitWrapper (en el init.js).  Precisamente en ésta función se verifica si la variable _spFormOnSubmit se ha puesto a true, y en ese caso, se cancelan las peticiones de envió. Imagino que este mecanismo evita que se produzcan múltiples envíos del formulario ante un doble click del usuario.

La solución consta de dos pasos:

·    Asignar en el evento del botón (en el lado del cliente) a: 

exportRequested=true;

·    Añadir las siguientes líneas en el evento de carga (page_load) del control de usuario/pagina/webpart

string beforeSubmitJS = "var exportRequested = false; ";
beforeSubmitJS += "var beforeFormSubmitFunction = theForm.onsubmit;";
beforeSubmitJS += "theForm.onsubmit = function(){ ";
beforeSubmitJS += "var returnVal = beforeFormSubmitFunction();";
beforeSubmitJS += "if(exportRequested == returnVal){_spFormOnSubmitCalled=false; exportRequested=false;}";
//beforeSubmitJS += "alert(returnVal + ‘\n’ +_spFormOnSubmitCalled);";
beforeSubmitJS += "return returnVal;";
beforeSubmitJS += "};";
//beforeSubmitJS += "alert(theForm.onsubmit);";
this.Page.ClientScript.RegisterStartupScript(this.GetType(),"alterFormSubmitEvent", beforeSubmitJS, true);

Espero que os ayude.