2012-01-06 100 views
19

Estoy presentando un formulario en Asp.net MVC con un botón de envío. La página redirige después de la adición exitosa de registro en la base de datos. A continuación se muestra el código: -Evitar el envío de formularios duplicados en Asp.net MVC haciendo clic en enviar dos veces

[HttpPost] 
public ActionResult Create(BrandPicView brandPic) 
{ 
    if (ModelState.IsValid) 
    { 
     if (!String.IsNullOrEmpty(brandPic.Picture.PictureUrl)) 
     { 
      Picture picture = new Picture(); 
      picture.PictureUrl = brandPic.Picture.PictureUrl; 
      db.Pictures.Add(picture); 
      brandPic.Brand.PictureId = picture.Id; 
     } 
     db.Brands.Add(brandPic.Brand); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(); 
} 

Pero, mientras que las pruebas, vi que si la forma se hace clic en una y otra vez, las múltiples entradas se presentaron y se guardan en la base de datos.

¿Cómo me puedo asegurar de que si el formulario se envió una vez al servidor, no se envían duplicados?

+1

Esto ya se ha solicitado un número de veces antes: http://stackoverflow.com/questions/2324931/duplicate-form-submission-in-spring – Kane

+0

@Kane , +1 y lo siento. Siempre compruebo si la pregunta se ha realizado antes, pero puede ser que es hora de que cambie mi número de gafas ;-) ..... –

+0

Posible duplicado de [¿Cómo evito el envío de formularios múltiples en .NET MVC sin usar Javascript?] (https://stackoverflow.com/questions/4250604/how-do-i-prevent-multiple-form-submission-in-net-mvc-without-using-javascript) – KyleMit

Respuesta

61

No creo que esto sea un duplicado de la respuesta al que se hace referencia en el comentario, ya que el enlace es para Spring MVC, y esta pregunta es para .NET MVC.

De hecho, pasé unas horas en esto hace un tiempo, y se me ocurrió lo siguiente. Este javascript enlaza muy bien con la validación de jquery discreta, y puede aplicarlo a cualquier formulario que tenga <input type="submit". Note que usa jQuery función del 1,7 on: se necesitan

$(document).on('invalid-form.validate', 'form', function() { 
    var button = $(this).find('input[type="submit"]'); 
    setTimeout(function() { 
     button.removeAttr('disabled'); 
    }, 1); 
}); 
$(document).on('submit', 'form', function() { 
    var button = $(this).find('input[type="submit"]'); 
    setTimeout(function() { 
     button.attr('disabled', 'disabled'); 
    }, 0); 
}); 

Los setTimeouts. De lo contrario, podría terminar con un botón que está desactivado después de hacer clic, incluso cuando la validación del lado del cliente falla. Tenemos esto en un archivo javascript global para que se aplique automáticamente a todos nuestros formularios.

+0

Antes, pruebo esto, quiero hacerle saber que mi aplicación usa el jquery-1.5.1 como lo agregó VS al comienzo. Reemplazarlo con la versión 1.7 ¿afecta mi aplicación? –

+0

No puedo decirlo, pero no debería. Si quiere seguir con 1.5, puede cambiar 'on' por' live'. – danludwig

+6

Esto es bueno, pero debe mencionarse que podría estar usando botones, que esto no encontraría.Si está utilizando tanto las entradas como los botones, tendrá que buscar ambos como, var button = $ (this) .find ('input [type = "submit"], button [type = "submit"]'); – erosebe

6

Desactivar el botón de Enviar hizo clic. Esto se puede hacer usando JQuery/Java Script.

Mire this example para saber cómo hacer esto.

0

Desactivar el botón está bien a través de JavaScript, pero ¿qué sucede si el usuario lo tiene deshabilitado o lo omiten? Si usa la seguridad del lado del cliente, haga una copia de seguridad con el lado del servidor. Yo usaría el PRG pattern aquí.

+0

Desde el enlace al que hizo referencia: el patrón PRG no puede abordar todos los escenarios de envío de formularios duplicados. Algunos envíos de formularios duplicados conocidos que PRG no puede resolver son: ... si un usuario web hace clic varias veces en un botón de envío antes de que se cargue la respuesta del servidor (puede evitarse usando JavaScript para desactivar el botón después del primer clic). – danludwig

+0

@olivehour correcto, soy estúpido y no leí la pregunta correctamente. – eth0

+2

@ eth0 - no, usted * solo * no leyó la pregunta correctamente –

0

Puede utilizar Ajax.BeginForm insted de html.BeginForm para lograr esto, si se utiliza OnSuccess insted de OnBegin puede estar seguro de que su método de ejecutar con éxito y después de que su vuelta botón para desactivar, con el Ajax que permanecer en vista actual y se puede actualizar la vista actual en lugar de redirección

@using (Ajax.BeginForm(
new AjaxOptions 
{ 
    HttpMethod = "post", 
    InsertionMode = InsertionMode.Replace, 
    UpdateTargetId = "dive", 
    OnBegin="deactive" 
})) 
{ 
//body of your form same as Html.BeginForm 
<input type="submit" id="Submit" value="Submit" /> 
} 

y utilizar esta jQuery en su forma:

<script type="text/javascript" language="javascript"> function deactive() { $("#Submit").attr("disabled", true); }</script> 

tener cuidado para el uso de Ajax tiene que c todo esto alforja al final de la página

<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script> 
Cuestiones relacionadas