2010-01-14 47 views
5

我有一個Ajax表單,可以讓我使用OnComplete AjaxOption從表中動態刪除表中的行。這很好。ASP.NET MVC Ajax Post執行OnComplete即使確認失敗

問題是,即使我在確認對話框中點擊「取消」,它仍然會執行OnComplete JavaScript。所以表單不會發布,但它看起來像它對用戶做的那樣(該行從表中刪除)。

任何想法?下面的源代碼:

的onComplete JS:

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

表格代號:

<% 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

哇,這一定是一個難題。任何人都想嘗試一下嗎? :-) – jchapa 2010-01-26 00:07:20

+0

你可以用FireBug確認沒有發生javascript錯誤嗎?這不應該發生,通常JavaScript語法或運行時錯誤是造成古怪的原因。 – 2010-01-26 02:38:16

+0

沒有錯誤(每個Web開發工具欄和Firebug)... – jchapa 2010-01-26 04:23:58

回答

7

的的onSuccess參數採用一個字符串,它給出了一個函數的名字被調用,而不是實際的函數調用。所以你可以通過它「fadeDel」,但不是「fadeDel(5)」。當你傳遞一個Javascript調用時,它會馬上評估它,所以當你點擊提交時,即使在AJAX調用之前,它也正在執行fadeDel(5)。您可以通過使用Firebug或IE測試工具進行調試來驗證。

如果要使用OnSuccess方法處理此問題,則需要使用不帶任何參數的方法。一種方法是從「this」中獲取產品ID,這將是提交表單。你既可以從表格ID解析它,或只是將其包含在窗體的標題或名稱屬性:

<% 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" /> 
<%} %> 

然後你就可以更新fadeDel從「這個」拉值:

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

還有其他方法來處理這個 - 例如一個jQuery.ajax()調用 - 但無參數的OnSuccess調用應該可以正常工作。

+0

就是這樣!謝謝您的幫助。 – jchapa 2010-01-26 21:17:32

相關問題