asp.net form-submit duplicate-data

asp.net - Cómo evitar las devoluciones repetidas de confundir mi capa de negocios



form-submit duplicate-data (7)

Todos hemos visto los sitios web que desactivan los botones "enviar" cuando haces clic en ellos. Esto a menudo se hace para evitar que los usuarios hagan clic en el botón varias veces. Normalmente esto se logra usando un evento de JavaScript ''onclick'' para deshabilitar el botón. En ASP.NET, cada elemento del lado del servidor ya tiene un controlador de eventos onclick que llama al servidor para el procesamiento de eventos. Para lograr lo mismo en ASP.NET, podrías hacer lo siguiente:

btnSubmit.Attributes.Add("onclick", "this.disabled=true;" + GetPostBackEventReference(btnSubmit).ToString());

Donde ''btnSubmit'' es el nombre del botón en cuestión. Lo que ocurre aquí es que creamos un evento onclick que hace dos cosas. En primer lugar, desactiva el botón en el navegador de los usuarios. Lo segundo que hace es enviar el evento de devolución de datos normal al servidor.

Tengo una aplicación web (ASP.Net 3.5) con un diseño convencional de 3 capas. Si el usuario hace clic en un botón, se produce una devolución de datos, algunos códigos intermedios y de capa de datos se ejecutan y la pantalla se actualiza. Si el usuario hace clic varias veces en el botón antes de que se complete la primera devolución, mi lógica se confunde y la aplicación puede terminar en un estado no válido. ¿Cuáles son las mejores formas de prevenir esto?

Puedo usar javascript para desactivar el botón, pero esto solo oculta el problema. ¿Cómo construyo mi negocio y capas de datos para manejar esto?


  1. Desactive el botón de enviar una vez que haga clic. Esto evitará un doble clic accidental o más
  2. Por lo general, me redirige a una URL diferente después de la devolución de datos para evitar la actualización accidental / intencional de la página.
  3. Finalmente, en su método de inserción de DB, verifique que haya datos idénticos insertados dentro de un marco de tiempo determinado (probablemente en segundos) antes de hacer la inserción. Si se encuentran datos duplicados insertados en cuestión de segundos (o minutos, lo que sea más lógico en su situación), muestre un mensaje de advertencia y solicite al usuario que vuelva a enviar el envío si el usuario considera que no se trata de un error. (Este método tiene más sentido cuando tiene una cuenta de usuario y el usuario envía datos cuando inicia sesión, por lo que se realiza una verificación de datos duplicados para el usuario).


Si tuviera que ser brutalmente honesto, diría que parece que es usted el que está confundido acerca de las autorreferencias web, no su aplicación (eso es si usted fue quien la escribió). ;-)

Dicho esto, además de otras sugerencias, lo que haría en este caso es colocar un "token" en el campo oculto en el formulario, como un GUID, que se publicará. Use esto para seguir el trabajo que se está realizando y solo permita que se use una vez. Por ejemplo, una vez publicado, colóquelo en el almacenamiento de la sesión. Cada vez que se realiza una devolución de datos, compruebe primero la sesión de este token y, si está allí, no haga nada. Si NO está allí, guárdelo en sesión y haga el trabajo. Cuando la sesión finaliza, los tokens se descartan automágicamente. Fácil. Mucho mejor que algún token complicado de base de datos.

  • Oisin

He resuelto el problema al escribir un javascript deshabilitando el botón de función de hacer clic:

MyButton.Attributes.Add("onclick", "javascript:this.onclick=function(){return false;};");


Incluso tengo el mismo problema que he resuelto como Abajo.

Después de cargar un archivo, si lo redirige a la same page o a some other page in your project , se evitará este problema.

Por ejemplo:

En Mi ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="WebApplication.WebForm" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> </div> </form> </body> </html>

Incluso tengo el mismo problema que he resuelto como Abajo.

Después de cargar el archivo, si lo redirige a la misma página o a otra página de su proyecto. Después de la respuesta de redirección no estará allí una vez que lo redirigió.

En Mi ASPX

En mi código detrás

public partial class WebForm : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string path = Server.MapPath("~"); path = path + FileUpload1.FileName; FileUpload1.SaveAs(path); Response.Redirect("WebForm.aspx"); // Responce will be cleared. This Redirection will do the Trick //Put the debugger and check it will work } }

Aquí, para mostrar el éxito y los mensajes de error, intente utilizar sesiones.


Mira este control ASP.NET AJAX llamado PostBack Ritalin de un compañero SO''r Dave Ward .