2010-01-14 19 views
5

Mam formularz Ajax, który pozwala mi dynamicznie usuwać wiersze z tabeli przy użyciu Onjax AjaxOption OnComplete. To działa świetnie.ASP.NET MVC Ajax Post wykonywanie OnComplete Nawet jeśli Confirm Fails

Problem polega na tym, że nawet jeśli kliknę "Anuluj" w oknie dialogowym potwierdzenia, nadal będzie on wykonywać javascript OnComplete. Tak więc formularz nie jest wysyłany, ale wygląda na to, że zrobił to użytkownikowi (wiersz został usunięty z tabeli).

Wszelkie pomysły? Kod źródłowy poniżej:

onComplete JS: Kod

function fadeDel(id) { 
    $("#product" + id).fadeOut(500); 
    } 

Postać:

<% using (Ajax.BeginForm("DeleteProduct", "Commerce", new { id = product.Id }, 
    new AjaxOptions 
    { 
     OnSuccess = "fadeDel(" + product.Id + ")", 
     Confirm = "Are you sure you want to delete" + product.Title 
    }, new { id = "frm" + product.Id })) 
    { %> 
    <%= Html.SubmitImage("Delete", Url.Content("~/content/images/12-em-cross.png"))%> 
<%} %> 
+0

Wow, to musi być trudne pytanie. Czy ktoś chce to zrobić? :-) – jchapa

+0

Czy możesz potwierdzić w FireBug, że nie występują błędy javascript? To nie powinno się dziać, zazwyczaj składnia javascript lub błąd runtime jest przyczyną czegoś zwariowanego. –

+0

Brak błędów (na pasek narzędzi programisty stron internetowych i Firebug) ... – jchapa

Odpowiedz

7

Parametr onSuccess pobiera ciąg, który daje nazwę funkcji nazywać, a nie rzeczywiste wywołanie funkcji . Możesz więc przekazać to "fadeDel", ale nie "fadeDel (5)". Kiedy przekazujesz to wywołanie JavaScript, to ocenia je natychmiast, więc wykonuje polecenie fadeDel (5) tuż po kliknięciu przycisku Wyślij, nawet przed wywołaniem AJAX. Możesz to sprawdzić, debugując przy użyciu narzędzi testowych Firebug lub IE.

Jeśli chcesz sobie z tym poradzić przy użyciu metody OnSuccess, musisz użyć tej, która nie przyjmuje żadnych parametrów. Jednym ze sposobów, aby to zrobić, jest pobranie identyfikatora produktu z "tego", który będzie stanowił formularz do przesłania. Można też analizować je z ID formularz lub po prostu umieścić go w formie w tytule lub Nazwa nieruchomości:

<% using (Ajax.BeginForm("DeleteProduct", "Commerce", new { id = product.Id }, 
new AjaxOptions 
{ 
    OnSuccess = "fadeDel", 
    Confirm = "Are you sure you want to delete" + product.Title 
}, new { id = "frm" + product.Id, name = product.Id })) 
{ %> 
    <input type="submit" name="Delete" /> 
<%} %> 

Następnie można zaktualizować fadeDel wyciągnąć wartość z „to”:

function fadeDel() { 
    var id = this.name; 
    $("#product" + id).fadeOut(500); 
} 

Są na to inne sposoby - np wywołanie jQuery.ajax() - ale bez parametrów wywołanie OnSuccess powinno działać poprawnie.

+0

To wszystko! Dzięki za pomoc. – jchapa

Powiązane problemy