2009-01-26 10 views
6

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?Cómo evitar las devoluciones repetidas de confundir mi capa empresarial

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?

+0

Hace un tiempo pregunté algo similar ... http://stackoverflow.com/questions/305684/how-can-i-prevent-database-being-written-to-again-when-the-browser -does-a-reload – Marty

Respuesta

1

Si fuera brutalmente honesto, diría que parece ser que usted es el confundido acerca de las devoluciones de la web, no su aplicación (eso es si usted es 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 posteó. Use esto para seguir el trabajo que se está realizando y solo permita que se use una vez. P.ej. cuando se publique nuevamente, 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
+0

Estoy haciendo algo muy similar con memcached para el token. Incluya el GUID como un campo oculto en el formulario, luego cuando se publique, intente AGREGARLO a memcached. Si el complemento falla, ya se agregó, así que no haga nada. Las claves caducan después de poco tiempo, y memcached no es confiable, pero ya he implementado redirect-after-post y solo necesito algo para manejar ocasionalmente el doble clic del submit buttun (generalmente por los grandes jefes ...) –

0
  1. hacer desactivar el botón de envío una vez que ha hecho clic. Esto evitará un doble clic accidental o más
  2. Normalmente, redirecciono a una URL diferente después de la devolución de datos para evitar la actualización accidental/intencional de la página.
  3. Por último, en su método de inserción de base de datos, , compruebe que haya datos idénticos insertados dentro de un período 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 haga que el usuario pulse enviar de nuevo si el usuario siente que no es un error. (Este método tiene más sentido cuando se tiene cuenta de usuario y el usuario es la presentación de los datos cuando se haya identificado, de modo duplicado de verificación de datos se realiza para el usuario.)
0

He resuelto el problema de escribir un javascript deshabilitar el botón de función de clic:

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

Todos hemos visto los sitios web que desactivan los botones de "enviar" al hacer clic en ellos. Esto a menudo se hace para evitar que los usuarios hagan clic en el botón varias veces. Normalmente, esto se lleva a cabo mediante 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, fácilmente se podría hacer:

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

Dónde 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.

0

Incluso tengo el mismo problema que he resuelto a continuación.

Después de cargar un archivo Si lo redirige a same page o 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 a continuación.

Después de cargar el archivo si lo redirige a la misma página o a alguna 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 Detrás oda

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 mensajes de error tratar de usar sesiones.

Cuestiones relacionadas