2009-07-29 19 views
10

Me gustaría utilizar la opción OnSuccess de AjaxOptions pasada como argumento Ajax.BeginForm para "hacer algo" una vez que la respuesta se haya recibido por completo y se haya actualizado DOM. Por lo que puedo entender desde MSDN, esto es lo que hace esta opción.Asp.NET MVC AjaxOptions OnSuccess se dispara ... ¿demasiado pronto?

En mi aplicación, la secuencia de comandos OnSuccess se dispara demasiado pronto, inmediatamente después de enviar la solicitud. Pongo a dormir el hilo por un tiempo, para ver mejor el resultado. Supongo que veré el script OnSuccess (una alerta) disparado después de ese tiempo de suspensión, digamos, 2 segundos. Uso Firebug para ver lo que ocurre debajo del capó, y todo lo que veo es: hago clic en el botón (enviar dentro del formulario ajax), aparece la alerta (2 segundos antes de lo esperado), después de 2 segundos Firebug muestra la solicitud y respuesta y nada más sucede.

¿Dónde me equivoco?

Gracias de antemano, mt

algunos ejemplos de código, tal como solicitó correctamente (Empecé una nueva solución en blanco usando la plantilla Asp.NET MVC en VS):

vista Inicio/Índice:

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
<div id="divPlaceholder"> 
<% 
    using (Ajax.BeginForm("DoLongTask", "Home", 
    new AjaxOptions() { 
     UpdateTargetId = "divPlaceholder", 
     InsertionMode = InsertionMode.Replace, 
     OnSuccess = "alert('onsuccess fired')" 
    })) 
{ 
%> 
<input type="submit" value="button" /> 
<% } %> 
</div> 
</asp:Content> 

HomeController

public ActionResult DoLongTask() 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     System.Threading.Thread.Sleep(2000); 
     return View(); 
    } 
    else 
    { 
     throw new NotSupportedException(); 
    } 
} 

Creo que esto es suficiente para reproducir el comportamiento. Una vista parcial vacía se puede usar como vista DoLongTask.

+2

publicar ... su ... código ...! – womp

+0

¡Código agregado como (correctamente) preguntado! – ccalboni

Respuesta

10

He estado investigando este problema y parece que los eventos "Sí" no son lo que parecen.

Si lee esta publicación How is OnSuccess measured for a ASP.NET MVC ActionLink?, verá womp diciendo que los eventos pueden disparar sin importar lo que ocurra en el controlador. También he encontrado esto en las pruebas que hice sumando todos los eventos "ON" para los AjaxOptions objeto como éste:

new AjaxOptions() 
{ 
    UpdateTargetId = "divPlaceholder", 
    InsertionMode = InsertionMode.Replace, 
    OnSuccess = "alert('OnSuccess')", 
    OnBegin = "alert('OnBegin')", 
    OnComplete = "alert('OnComplete')", 
    OnFailure = "alert('OnFailure')" 

} 

No he utilizado los AjaxOptions en cualquier código de producción que he escrito, pero he tenido gran éxito con las llamadas jQuery Ajax y los eventos disparando en los momentos correctos.

Un tutorial sobre ASP.net MVC y jQuery Ajax se puede encontrar here y algunos ejemplos de cómo utilizar los eventos se puede encontrar en el código en this question

Lo siento, no he sido capaz de solucionar su problema, pero me Espero que esta alternativa ayude.

+0

Gracias Webmonger, soy nuevo en MVC pero tengo cierta experiencia con Ajax a través de JQuery: seguiré su sugerencia para maximizar esta experiencia dentro del entorno MVC, en la medida en que pueda entender que estos mundos pueden vivir bastante bien juntos. – ccalboni

+0

He lanzado un par de aplicaciones asp.net mvc ahora y tanto yo como mis desarrolladores encontramos que jQuery y asp.net MVC funcionan de maravilla juntos. También hay muchos buenos ejemplos de buenas prácticas. http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx#jQuery – Webmonger

+1

Vea la respuesta de Paul McCaskie ... es la correcta. Este es un uso normal para jquery o javascript. Si haces lo mismo en una llamada a un evento jquery, sucederá lo mismo. Tienes que darle el nombre de una función o ajustar tu código con la función() {} – Edyn

24

No está seguro de lo útil que será pero estoy en busca de hacer algo como esto en el momento y hallarse si se llama a una función dentro del OnSucess entonces que va a pasar después de que el método de acción, por ejemplo:

using (Ajax.BeginForm("DoLongTask", "Home", 
    new AjaxOptions() { 
     UpdateTargetId = "divPlaceholder", 
     InsertionMode = InsertionMode.Replace, 
     OnSuccess = "function() { alert('onsuccess fired'); }" 
    })) 
+0

el formato 'function() {}' funcionó para mí, gracias. – Maslow

+0

Sí, esto funciona como esperaba para mí. –

+0

funcionó para mí tooo :) .Gracias mucho –

4

OnSuccess es una propiedad que toma el nombre de la función o la función como en el caso anterior (no ninguna declaración). Y AjaxOptions llama el método para el cual se proporciona el nombre, después de éxito, falla, ...Espero que esto ayude

1

llamar a una función igual

función showAlert() { alert ("Hola mundo"); }

llamada en Ajax Begin

onSuccess = "showAlert"

sin paréntesis

1

acabo de probar la devolución de llamada onSuccess en MVC 3 y parece que se determinen.

Cuestiones relacionadas