2013-07-16 40 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的值,您可以显示自定义错误消息。

相关问题