Tuesday, September 05, 2006

[ASP .NET] Controlar la múltiple pulsación

Al desarrollar aplicaciones web te puedes haber percatado que un proceso puede ser abortado y reiniciado por una nueva pulsación, por ejemplo, supongamos que debes iniciar un proceso al presionar el botón Aceptar del siguiente formulario:


Entonces se iniciaría el proceso y el usuario vería en su pantalla la barra de progreso:


Pero, que ocurre si presiona nuevamente el botón?, bueno, por defecto el proceso volvería a iniciarse, lo cual es un problema si el trabajo que realiza el servidor toma mucho tiempo y el usuario tiene poca paciencia.

Para evitar ello utilizando ASP.NET podemos realizar los siguientes pasos:
1) Utilizar un CustomValidator
2) Utilizar un Campo oculto
3) Crear un script de cliente

El custom validator nos permite hacer un llamado a script de cliente y/o servidor al ocurrir un evento en un formulario, de esta forma podemos crear nuestra propia función de validación.

La idea es la siguiente: Al iniciar el proceso, el customValidator llamará a un script de cliente (en este caso javascript), el script accederá al campo oculto del formulario y verificará algún estado (usaremos un textBox y el estado será que el componente se encuentre vacío), de no verificarse el estado que utilicemos no se enviará información al servidor (no se detiene el proceso en el servidor por una nueva llamada de cliente) y se responderá al usuario desde el mismo browser. De cumplirse el estado del componente el script llevará el formulario al estado buscado antes de iniciar el proceso, y al finalizar el trabajo, el script de servidor debe cambiar el estado.


El script de cliente:
function validar(object, args){
var str="txtDummy";
var objText = document.getElementById(str);
if (objText==null){
return;
}
if (objText.value.length>0){
alert('Ya esta procesando la información, por favor espere');
args.IsValid=false;
return;
}
document.getElementById(str).innerText="Processing...";
args.IsValid=true;
}

Donde txtDummy es nuestro componente escondido, si contiene texto entonces se retorna en args.IsValid false para indicar que falló la validación del customValidator (por lo tanto no se accede al servidor), si no contiene texto se ingresa la cadena "Processing..." y se indica que la validación fue un éxito. De esta forma se accederá al script de servidor:

Private Sub cmdSubir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSubir.Click
'Inicio del proceso

'Proceso en servidor

'Fin del proceso - limpiamos el componente oculto para permitir una nueva
'llamada al servidor
txtDummy.Text = String.Empty
End Sub

Como vemos, al finalizar el proceso de servidor debe limpiarse el texto del componente oculto, de forma que el script de cliente pueda volver a permitir el llamado al servidor. Algo importante que debes tener en cuenta es que para ocultar el componente txtDummy no debes setear su visibilidad en false, porque de esa forma el script de cliente no tendrá acceso a el.

0 Comments:

Post a Comment

<< Home