2013-07-16 73 views
3

我的問題的本質是:如果我發出一個$ .ajax請求到我的服務器進行服務器端驗證 - 我應該如何處理驗證響應?我把自己當作有兩個選項:在ajax請求上接收服務器異常消息的最佳做法

// Server handled error: 
$.ajax({ 
    url: 'controller/action', 
    data: {}, 
    success: function(response){ 
     console.log("Error:", response.error); 
    } 
} 

// Server unhandled error: 
$.ajax({ 
    url: 'controller/action', 
    data: {}, 
    success: function(){ 
    }, 
    error: function(error){ 
     console.log("Error:", error); 
    } 
} 

前者示例假設我的服務器的控制器具有一個try/catch消耗任何服務器端異常。然後它接受任何異常並將它們作爲json成功對象的一部分返回。後者允許服務器的異常冒泡並通過ajax錯誤處理程序捕獲。

就我個人而言,我認爲我更喜歡後者。但是,我剛剛遇到了遠程處理的問題 - 如果我們的服務器的安全設置沒有放鬆,那麼錯誤消息被隱藏爲「運行時錯誤」,並且從ajax的onerror事件處理程序中讀取錯誤信息變得不可能。

我想避免這個問題,我需要始終能夠讀取我的錯誤,但似乎真的錯了有我的ajax請求總是返回成功。

這通常如何處理?

[HttpPost, AjaxOnly] 
public ActionResult ChangePassword(ChangePasswordDialogModel model) 
{ 
    string error = string.Empty; 

    if (model.NewPassword == model.NewPasswordConfirm) 
    { 
     using (var service = new SecurityServicesSoapClient()) 
     { 
      error = service.ChangePassword(SessionManager.Default.User.UserName, model.OldPassword, 
              model.NewPassword); 
     } 
    } 
    else 
    { 
     error = "New Password and Confirm do not match. Please re-enter"; 
    } 

    if (!string.IsNullOrEmpty(error)) 
     throw new Exception(error); 

    return Json(new 
     { 
      success = true 
     }); 
} 

這與將成功設置爲false並將錯誤屬性設置爲錯誤消息。

+0

就我個人而言,我將客戶端和服務器端代碼視爲單獨的應用程序。前者只是訪問後者的API。因此,我想確保服務器端應用程序(如任何應用程序)_never_具有未處理的異常。如果存在需要與客戶通信的錯誤條件,則應該在該客戶熟悉的結構中進行。在HTTP中,這將是錯誤代碼和響應主體。 – David

回答

2

我在我的系統中做了一些非常類似的事情。

$data['errors'] = array(/* your error data */); //PHP 

您可以設置標誌,以尋找異常代碼在你的控制器捕捉()語句來過濾類型的錯誤消息:而錯誤總是喜歡做

$data['success'] = array(/* your data to be served back to the page */); //PHP 

:成功總是返回數據等。在您的JS代碼,你只是做:

// JS 
$.ajax({success:function(data) { 
    if (data.success !== undefined) {} 
    else if (data.errors !== undefined) {} 
}}); 

你可以瘋狂,並通過將此代碼添加到一個$(document).ajaxComplete();回調將其添加爲全局AJAX處理爲好。

你可以並且應該有一個單獨的ajax錯誤回調處理程序,因爲它可以包含你的控制器代碼無法控制的情況(404錯誤,服務器無法訪問等)。

0

我想你可以試試這個來檢查ajax調用的錯誤。

$.ajax({ 
    url: 'controller/action', 
    data: {}, 
    success: function(){ 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     alert(jqXHR.status); 
    } 
} 

根據jqXHR.status的值,您可以顯示自定義錯誤消息。

相關問題