2009-07-29 4 views
10

Chciałbym użyć opcji OnSuccess dla AjaxOptions przekazanej jako argument Ajax.BeginForm, aby "zrobić coś", gdy odpowiedź zostanie całkowicie odebrana, a DOM zaktualizowany. O ile mogę odłączyć się od MSDN, to jest to, co robi ta opcja.Asp.NET MVC AjaxOptions OnSuccess wystrzeliwuje ... za wcześnie?

W mojej aplikacji skrypt OnSuccess uruchamia się zbyt wcześnie, natychmiast po wysłaniu żądania. Przez chwilę kładę się spać, aby lepiej widzieć rezultat. Powinienem zobaczyć skrypt OnSuccess (alert) wystrzelony po tym czasie snu, powiedzmy, 2 sekundy. Używam Firebuga, aby zobaczyć, co dzieje się pod maską, i wszystko, co widzę, to: kliknę przycisk (przesłać w formularzu ajax), pojawia się alert (2 sekundy przed oczekiwaniem), po 2 sekundach firebug pokazuje żądanie-odpowiedź i nic więcej się dzieje.

Gdzie się mylę?

Dzięki z góry, mt

Niektóre przykładowy kod, jak słusznie zapytał (zacząłem pusty nowego rozwiązania przy użyciu Asp.NET MVC szablon w VS):

widok Home/Index:

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

Myślę, że to wystarczy, aby odtworzyć zachowanie. Pusty widok częściowy może być używany jako widok DoLongTask.

+2

post ... twój ... kod ....! – womp

+0

Kod dodany jako (poprawnie) zapytany! – ccalboni

Odpowiedz

10

Zajrzałem do tego problemu i wydaje się, że zdarzenia "On" nie są takie, jakimi się wydają.

Jeśli przeczytasz ten wpis How is OnSuccess measured for a ASP.NET MVC ActionLink? zobaczysz, że womp mówi, że zdarzenia mogą być uruchamiane niezależnie od tego, co dzieje się w kontrolerze. Odkryłem także, to w testach zrobiłem dodając wszystkie zdarzenia „ON” do AjaxOptions Object tak:

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

} 

nie wykorzystali AjaxOptions w każdym kodzie produkcji pisałem ale miałem wielki sukces dzięki wywołaniom jQuery Ajax i wydarzeniom wystrzeliwanym we właściwym czasie.

tutorial ASP.net MVC i jQuery Ajax można znaleźć here i kilka przykładów, jak używać zdarzeń można znaleźć w kodzie na this question

Niestety ja nie byłem w stanie rozwiązać problemu ale mam nadzieję, że ta alternatywa pomoże.

+0

Dziękuję Webmonger, jestem nowy w MVC, ale mam pewne doświadczenie z Ajaxem za pośrednictwem JQuery: Będę podążał za twoją sugestią, aby zmaksymalizować to doświadczenie w środowisku MVC, o ile mogę nie udawać, że te światy mogą żyć dość dobrze razem. – ccalboni

+0

Uruchomiłem kilka aplikacji mvc asp.net teraz i zarówno ja, jak i moi programiści, znajdujemy razem jQuery i asp.net MVC. Istnieje również wiele dobrych przykładów dobrej praktyki. http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx#jQuery – Webmonger

+1

Zobacz odpowiedź Paula McCaskiego ... jest poprawna. Jest to normalne użycie dla jquery lub javascript. Jeśli zrobisz to samo w wywołaniu zdarzenia jquery, to samo stanie się. Musisz nadać mu nazwę funkcji lub zawinąć kod za pomocą funkcji() {} – Edyn

24

Nie wiesz, jak pomocne będzie, ale szukam w robieniu czegoś takiego w tej chwili i odkryli, jeśli wołać do funkcji w OnSucess to nastąpi po metody działania, na przykład:

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

działał dla mnie format 'function() {}', dzięki. – Maslow

+0

Tak, to działa zgodnie z oczekiwaniami. –

+0

pracował dla mnie tooo :). Thanks it lot –

4

OnSuccess jest właściwością, która przyjmuje nazwę funkcji lub funkcji, jak w powyższym przypadku (nie dotyczy żadnej instrukcji). AjaxOptions wywołuje metodę, dla której podano nazwę, po sukcesie, niepowodzeniu, ...Nadzieję, że to pomaga

1

wywołać funkcję jak

funkcji showAlert() { alert ("Hello World"); }

połączeń w Ajax Rozpocznij

onSuccess = "showAlert"

bez nawiasów

1

Właśnie testowałem onSuccess zwrotnego w MVC 3 i wydaje się być rozwiązany.