2010-10-31 13 views
14

Después de actualizar mi ASP MVC de 3 Preview a 3 Beta veo un comportamiento extraño en mis formularios Ajax.Formulario enviado dos veces después de la actualización de ASP MVC 3 Vista previa a Beta

@using(Ajax.BeginForm("New", new AjaxOptions() {OnSuccess = "onAjaxSuccess", OnFailure = "onAjaxFailure", OnBegin = "onAjaxBegin", HttpMethod = "Post"})) {} 

<form action="/Order/New" data-ajax="true" data-ajax-begin="onAjaxBegin" data-ajax-failure="onAjaxFailure" data-ajax-method="Post" data-ajax-success="onAjaxSuccess" method="post"></form> 

he presentado un alert dentro de mi función onAjaxBegin y esta en buen estado disparado dos veces, cada vez que haga clic en mi botón de enviar.

¿Alguien más ha visto este comportamiento? No he cambiado nada en el código después de la actualización, y funcionó perfectamente antes de la actualización.

Respuesta

14

Mire el código HTML generado. In ASP.NET MVC 3 Beta hay nuevo soporte para javascript discreto basado en jquery y todos los ayudantes de Ajax usan jquery ahora. Tal vez queda algo con MS Ajax que causa la doble llamada. Asegúrese de eliminar todas las inclusiones de scripts MSAjax de la página. Además, ¿por qué usar Ajax.BeginForm cuando podría simplemente usar Html.BeginForm con jquery discreto?

+0

¡Después de haber eliminado la referencia a los antiguos scripts de MSAjax, funcionó! – Martin

+0

@Darin Dimitrov ¿Puedes mostrar un ejemplo? – IamStalker

+0

@IamStalker, ejemplo de qué? –

1

Se puede utilizar en lugar de bindlive en jquery.unobtrusive-ajax.min.js ~~~ Esto es muy important.Because live evento se llame a los eventos anteriores, pero cada vez que bind sólo llama el evento actual.

2

una pequeña propina todo el tiempo antes de utilizar .live(), do. die() :)
esto matará a todos los scripts de Java adjuntos a este evento y creará uno nuevo.

ejemplo:

$(function() { 
    $('#MyInfoForm').die(); 
    $("#MyInfoForm").live('submit', function(e) { 
     //some code 
     e.preventDefault(); 
    }); 
}); 
+0

consejo interesante, gracias – Tony

29

que tenían el mismo problema, y ​​he encontrado la solución: que se incluye el "jquery.unobtrusive-ajax.min.js" -Script dos veces :-)

+2

me salvaste el día :) no sé por qué el paquete incluía tanto las versiones dev como mín de la secuencia de comandos discreta.ajax – TheVillageIdiot

+1

La mía también. Esta debería ser la respuesta para esta pregunta. – Derrick

+0

Gracias! Pasaron 5 años, la versión 3.2.3 del paquete Microsoft.jQuery.Unobtrusive.Ajax y aún este problema si se incluye dos veces. – Artyom

0

también tuve este problema exacto y por una muy diferente razon Incluí la referencia del script en jquery.unobtrusive-ajax.min.js en el div que se actualizó. Moverlo fuera del div lo arregló.

7

La duplicada jquery.unobtrusive-ajax.min.js también puede ocurrir si su controlador devuelve View() en lugar de PartialView().

+0

Ha revisado todas las sugerencias excepto esta. Supuse que estaba haciendo lo correcto. Pero finalmente lo verifiqué. Finalmente fue capaz de descifrarlo. –

0

Tuve el mismo problema. Tenía una vista parcial de inicio de sesión en la página maestra que incluía jquery.unobtrusive-ajax.min.js. También tuve este archivo incluido en mi opinión. Así que eliminé uno y el problema se resuelve ahora.

0

Esto podría ser útil para alguien que tiene un escenario similar a lo que tengo:

En mi página, el formulario de edición se abre una vista parcial dentro de una ventana emergente modal Kendo interfaz de usuario, que carga el código de la formar dinámicamente, incluyendo jquery.unobtrusive-ajax.js. Con esta configuración, que puede relacionarse con cualquier ventana emergente como jQuery UI y no solo Kendo UI, el comportamiento del envío de formularios es el siguiente:

La primera vez que se abre la ventana emergente, el envío de formularios causa una sola llamada al código del controlador (lado del servidor). Hasta aquí todo bien. Sin embargo, por segunda vez que se abre la ventana (sin cerrar la página del contenedor), el envío del formulario llama al controlador 2 veces. Posteriormente, cada reapertura de la ventana emergente causa una carga adicional del código jquery.unobtrusive-ajax.js, que a su vez causa una llamada no deseada adicional al controlador en cada envío del formulario.

Para solucionar el problema, moví la inclusión de jquery.unobtrusive-ajax.js de la vista parcial de la ventana emergente a la página principal. Sin embargo esto hizo que el lado del cliente parada de validación de trabajo, y para arreglar eso, he utilizado la solución proporcionada aquí: client side validation with dynamically added field que une a esta entrada del blog: http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/

3

que tenía el mismo problema usando una llamada AJAX.BeginForm que es cargado dinámicamente usando $.load() Lo resolví quitando el adicional incluye de jquery.unobtrusive-ajax.min.js en el formulario cargado. Esa es la clave!

0

Descubrí la solución, simplemente elimine todas las referencias de jquery.unobtrusive-ajax.js, ya que está usando Ajax.BeginForm, usará normalmente el ajax.

Así que no tiene que deshabilitar el ajax.

1

Movimiento jquery.unobtrusive-ajax.js fuera de vista parcial resuelto el problema en mi caso.

2

Solo para futura referencia para aquellos que usan ASP.NET MVC; "~/Scripts/jquery.unobtrusive*" hace también incluye "~/Scripts/jquery.unobtrusive-ajax.js".

Así que si su BundleConfig tiene este aspecto;

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
        "~/Scripts/jquery-{version}.js", 
        "~/Scripts/jquery.unobtrusive-ajax.js")); 

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
        "~/Scripts/jquery.unobtrusive*", 
        "~/Scripts/jquery.validate*")); 

Como resultado, se enviará un formulario Ajax dos veces. Eliminar el "~/Scripts/jquery.unobtrusive*" o "~/Scripts/jquery.unobtrusive-ajax.js" solucionará el problema.

Simplemente publicando esto porque es fácil pasar por alto "~/Scripts/jquery.unobtrusive*" al buscar unobtrusive-ajax.

Cuestiones relacionadas