2013-12-19 36 views
1

我在佈局頁面中註冊了一個jQuery全局處理程序來處理整個站點中的常見錯誤。這是它在佈局頁面中的註冊方式。jquery global ajaxError處理程序被調用,即使mvc Ajax.ActionLink調用被取消

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    if (jqXHR.status == "610") { 
     window.location.replace(loginUrl); 
    } 
    else if (jqXHR.status == "600") { } 
    else { 
     alert("An error occurred processing your request"); 
    } 
}); 

我有一個Ajax.ActionLink在我看來(CSHTML),我感到下面

@Ajax.ActionLink("Save List", "_SaveStates",null, 
            new AjaxOptions { OnSuccess = "onSaveSuccess", 
                OnBegin = "onSaveBegin", 
                OnComplete = "onComplete" 
            }, 
            new {@class="t-button", id="lnkSaveList" }) 

function onSaveBegin() { 
    var grid = $('#tlkBulkAddGrid').data('tGrid'); 
    if (grid.total == undefined || grid.total == "" || grid.total < 1) { 
     alert('List is Empty'); 
     return false; //Return False to cancel ajax call 
    } 
    $('.t-status .t-icon').addClass('t-loading'); 
} 

奇怪部給出返回從處理程序錯誤使用OnBegin處理程序取消之一即使我返回falseonSaveBegin()全球ajaxError被調用。我不明白爲什麼應該觸發全局錯誤處理程序,因爲ajax調用已被取消,並且沒有發出請求。

回答

0

Ajax.ActionLink幫手OnBegin方法返回實際上從jQuery.ajax()beforeSend函數返回

jQuery的文檔:

在beforeSend函數返回false將取消該請求。

取消請求會導致拋出ajax錯誤並調用您的處理程序。

解決您的問題,您可以檢查thrownError參數裏面的功能:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    if (thrownError === 'canceled' || thrownError === 'abort') 
     return; 
    ... 
}); 
+0

在jQuery 1.5中,thrownError是「中止」,而不是「取消」,但你的解釋是正確的。如果我是正確的,請通過'取消'替換'取消'來編輯您的答案。這樣我就能夠接受你的答案作爲解決方案。 – Jatin

+0

@Nirvan,該方法被稱爲'abort','thrownError'參數被'取消'。通過'jQuery 1.8.2'和'jQuery 1.10.2'測試。 – Zabavsky

+0

我不確定我完全理解你的上述評論。在我的情況thrownError ==='取消'返回false,但thrownError ==='abort'返回true。我正在使用MVC 3和確切的jQuery版本jquery-1.5.1。 – Jatin

相關問題