2012-09-24 54 views
10

Mam prosty formularz ajax w MVC. W AjaxOptions jest OnComplete ustawiony na prostą funkcję javascript, która robi jedną rzecz - zwraca false.Ajax.BeginForm z OnComplete zawsze aktualizuje stronę

@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { UpdateTargetId = "DivFormId", HttpMethod = "Post", OnComplete = "preventUpdate" })) 

function preventUpdate(xhr) { 
    return false;  
} 

Problem polega na tym, że strona jest już zaktualizowana. Na przykład. w jednym przypadku kontroler zwraca częściowy widok po odświeżeniu, w innym przypadku zwraca jakiś obiekt Json. Chcę go zaktualizować stronę po zwróceniu częściowego widoku i pokazać okno dialogowe po zwróceniu json. Niestety po zwróceniu json, usuwa stronę (aktualizuje ją jsonem), nawet gdy funkcja OnComplete zwraca wartość false, ponieważ MSDN mówi: Aby anulować aktualizację strony, zwróć false z funkcji JavaScript.

Jak zapobiec aktualizacji strony w zależności od otrzymanej odpowiedzi?

Dziękujemy!

----- AKTUALIZACJA -------

tej pory znalazłem następujące rozwiązanie. Kiedy nie określam UpdateTargetId, mogę zrobić ręcznie z odpowiedzią, co chcę. Ale nadal nie jest to udokumentowane zachowanie z błędem return.

+0

Może to pomoże, również spojrzeć na pierwszym komentarzu http://stackoverflow.com/a/1357151/985284 –

+1

To nie jest przypadek (ale na pewno spróbowałem również tych dwóch metod). To jest obsługa MS dla Ajax.BeginForm z takimi wydarzeniami jak OnBegin, OnComplete, ... I OnComplete zgodnie z MSDN doc powinien być możliwy do zatrzymania przez zwracanie false. –

Odpowiedz

22

Użyj OnSuccess i pozbądź się UpdateTargetId. Tak:

@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions { HttpMethod = "Post", OnSuccess = "foo" })) 
{ 
    ... 
} 

, a następnie:

function foo(result) { 
    if (result.SomePropertyThatExistsInYourJsonObject) { 
     // the server returned a JSON object => show the dialog window here 
    } else { 
     // the server returned a partial view => update the DOM: 
     $('#DivFormId').html(result); 
    } 
} 
+0

'$ ('# DivFormId'). Html (result.responseText);' pracował dla mnie – Filip

+0

Aby użyć Ajax.BeginForm potrzebujesz następującego pliku javascript (który nie jest standardem w szablonie MVC 5): jquery. unobtrusive-ajax.js https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/3.2.3 – Baxter