2008-09-08 26 views
7

Tengo algunos controles que heredan de los botones de ASP.NET y usan 'onserverclick'.Prevención de doble clic accidental en un botón

Si el usuario hace clic dos veces, el botón dispara dos eventos del lado del servidor. ¿Cómo puedo prevenir esto?

Intenté configurar "this.disabled = 'true'" después del clic (en el atributo 'onclick') a través de javascript, pero eso bloquea también la primera devolución de datos.

Respuesta

13

Consulte este ejemplo para deshabilitar el control en la devolución de datos. Debería ayudarlo a hacer lo que está tratando de lograr.

http://encosia.com/2007/04/17/disable-a-button-control-during-postback/

+0

Gracias ...Me faltaba la referencia de devolución manual necesaria para esa técnica – juan

+0

Desafortunadamente, cambiar UseSubmitBehavior a falso significa que su formulario ya no admitirá usuarios sin JavaScript. – NightOwl888

+0

Parece que el sitio no funciona, Chrome informa que el sitio contiene malware – SimplyInk

1

Alguien más dijo esto en algún lugar aquí hace unos días, y estoy de acuerdo: use Javascript para simplemente ocultar el botón en lugar de deshabilitarlo; podría mostrar una imagen "giratoria" en su lugar, lo que le permite saber lo que está sucediendo.

+1

No estoy convencido de que me guste la idea de que los botones desaparezcan. A menos que otro (botón deshabilitado) tome su lugar. Puede ser confuso para el usuario final ... ¿no? –

+0

Estoy de acuerdo con Rob, no me gustan los botones que desaparecen – juan

+0

+1 por la idea de un spinner, que muestra al usuario que algo está sucediendo. Aún le dejaría la posibilidad/"control" de presentar nuevamente, si él insiste absolutamente en hacerlo. – giraff

1

En lugar de esconderse, lo que he hecho es intercambiar botones usando javascript. Muestre otra imagen en gris con el clic del primer botón.

2

No necesariamente desea mostrar el botón deshabilitado en la devolución de datos. Desea asegurarse de que no se envíen accidentalmente dos veces. Por lo tanto, deshabilitar u ocultar el botón como resultado de una acción del lado del servidor ya es demasiado tarde en el juego. En este punto, la segunda solicitud ya está en camino. Debe hacerlo con javascript o asegurarse de que el código del servidor no se ejecute dos veces.

2

En caso de un UpdatePanel y un botón dentro de un FormView-Plantilla utilizo el siguiente enfoque:

<script type="text/javascript"> 
    // Using that prm reference, hook _initializeRequest 
    Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(InitializeRequestBuchung); 

    // Abfangen von Mehrfachklicks auf Buttons für asynchrone Postbacks im Updatepanel 
    function InitializeRequestBuchung(sender, args) { 
     var arrButtonIds = ["ButtonInsert", "ButtonUpdate"]; 

     // Get a reference to the PageRequestManager. 
     var prm = Sys.WebForms.PageRequestManager.getInstance(); 
     if (prm.get_isInAsyncPostBack() & jQuery.inArray(args.get_postBackElement().id, arrButtonIds) > -1) { 
      args.set_cancel(true); 
     } 
    } 
</script> 

Esto cancela una devolución de datos siguiente si actualmente una devolución de datos asincrónica todavía está activo. Funciona perfectamente.

1

Establezca la propiedad Button UseSubmitBehavior en false. Luego crea una función OnClientClick que deshabilita el botón. Se vería algo como esto:

<script type="text/javascript"> 
    function disableFunctn(button){ 
     button.disabled = true; 
    } 
</script> 
<asp:Button ID="button1" UseSubmitBehavior="false" OnClientClick="disableFunctn(this);"/> 

manera más rápida barata:

<asp:Button ID="button1" UseSubmitBehavior="false" OnClientClick="this.disabled=true;"/> 
0

También puede tratar, por ejemplo, btnSave.Enable = false; cuando se pulsa el botón y antes de que el procesamiento del botón se realice en la rutina Click Event. Si necesita que se restablezca para permitir que esté habilitado, tenga un botón por separado que restablezca el botón para su reutilización.

Otro método es configurar el botón con la verificación para que el usuario se pregunte si desea guardar, debería aparecer ambas veces.

Otro método más sería marcar la primera aparición y establecer una ventana emergente para el segundo para verificar un segundo uso o posterior.

Cuestiones relacionadas