我的問題的本質是:如果我發出一個$ .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並將錯誤屬性設置爲錯誤消息。
就我個人而言,我將客戶端和服務器端代碼視爲單獨的應用程序。前者只是訪問後者的API。因此,我想確保服務器端應用程序(如任何應用程序)_never_具有未處理的異常。如果存在需要與客戶通信的錯誤條件,則應該在該客戶熟悉的結構中進行。在HTTP中,這將是錯誤代碼和響應主體。 – David