2009-07-29 17 views
10

Mi piacerebbe utilizzare l'opzione OnSuccess di AjaxOptions passata come argomento Ajax.BeginForm per "fare qualcosa" una volta che la risposta è stata completamente ricevuta e il DOM aggiornato. Per quanto posso capire da MSDN, questo è ciò che fa questa opzione.Asp.NET MVC AjaxOptions OnSuccess spara .. troppo presto?

Nella mia applicazione, lo script di OnSuccess scatta troppo presto, immediatamente dopo l'invio della richiesta. Ho messo a dormire il filo per un po ', per vedere meglio il risultato. Dovevo vedere lo script di OnSuccess (un avviso) sparato dopo il tempo di sonno, diciamo, 2 secondi. Uso Firebug per vedere cosa succede sotto il cofano e tutto quello che vedo è: clicco sul pulsante (invio all'interno del modulo ajax), viene visualizzato un avviso (2 secondi prima del previsto), dopo 2 secondi firebug mostra la richiesta-risposta e niente più succede.

Dove mi sbaglio?

Grazie in anticipo, mt

Alcuni codice di esempio, come chiesto correttamente (ho iniziato una nuova soluzione in bianco utilizzando il modello MVC Asp.NET in VS):

vista Home/Indice:

<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(); 
    } 
} 

Penso che questo sia sufficiente per riprodurre il comportamento. Una vista parziale vuota può essere utilizzata come vista DoLongTask.

+2

post ... il tuo ... codice ....! – womp

+0

Codice aggiunto come richiesto (correttamente)! – ccalboni

risposta

10

Ho cercato questo problema e sembra che gli eventi "On" non siano esattamente come sembrano.

Se leggi questo post How is OnSuccess measured for a ASP.NET MVC ActionLink? vedrai che womp sta dicendo che gli eventi potrebbero essere attivati, a prescindere da ciò che accade nel controller. Ho trovato anche questo nelle prove che ho fatto con l'aggiunta di tutti gli eventi "On" per le AjaxOptions oggetto come questo:

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

} 

Non ho usato i AjaxOptions in qualsiasi codice di produzione che ho scritto, ma ho avuto grande successo con le chiamate jQuery Ajax e gli eventi che sparano nei momenti giusti.

Un tutorial su ASP.net MVC e jQuery Ajax può essere trovato here e alcuni esempi di come utilizzare gli eventi può essere trovato in codice su this question

Mi dispiace non sono stato in grado di risolvere il problema, ma io spero che questa alternativa ti possa aiutare.

+0

Grazie a Webmonger, sono nuovo di MVC, ma ho un po 'di esperienza con Ajax tramite JQuery: seguirò il tuo suggerimento per massimizzare questa esperienza all'interno dell'ambiente MVC, per quanto posso capire questi mondi possono vivere abbastanza bene insieme. – ccalboni

+0

Ho lanciato un paio di applicazioni asp.net per il mvc e sia io che i miei sviluppatori trovo che jQuery e asp.net MVC funzionano alla grande. Ci sono un sacco di buoni esempi di buone pratiche anche là fuori. http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx#jQuery – Webmonger

+1

Vedi la risposta di Paul McCaskie ... è quella giusta. Questo è normale per jquery o javascript. Se fai la stessa cosa in una chiamata di eventi jquery succederà la stessa cosa. Devi dargli il nome di una funzione o avvolgere il tuo codice con function() {} – Edyn

24

Non sono sicuro di come utile questa sarà ma sto cercando di fare qualcosa di simile al momento e hanno trovato se si chiama fuori per una funzione all'interno del OnSucess allora accadrà dopo il metodo di azione, ad esempio:

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

il formato 'function() {}' ha funzionato per me, grazie. – Maslow

+0

sì, questo funziona come previsto per me. –

+0

ha funzionato anche per me :). Grazie mille –

4

OnSuccess è una proprietà che prende il nome della funzione o della funzione come nel caso precedente (non in una qualsiasi posizione). E AjaxOptions chiama il metodo con cui viene fornito il nome, dopo il successo, l'insuccesso, ...Spero che questo aiuti

1

chiamata una funzione come

funzione showAlert() { alert ("Ciao Mondo"); }

chiamata in Ajax Begin

onSuccess = "showAlert"

senza parentesi

1

appena testato il callback OnSuccess in MVC 3 e sembra essere risolto.

Problemi correlati