在ajax请求上接收服务器异常消息的最佳实践

时间:2013-07-16 16:56:45

标签: jquery ajax exception-handling

我的问题的实质是:如果我向服务器发出$ .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并将错误属性设置为错误消息。

2 个答案:

答案 0 :(得分:4)

我在我的系统中做了类似的事情。成功总是返回如下数据:

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

而错误总是像:

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

您可以设置标志以在控制器catch()语句中查找异常代码,以过滤错误消息的类型。在您的JS代码中,您只需:

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

通过将此代码添加到$(document).ajaxComplete();回调中,您可以变得更加疯狂,并将它们添加为全局AJAX处理程序。

您可以并且应该为ajax错误回调设置单独的处理程序,因为这可能包括您的控制器代码无法控制的情况(404错误,服务器无法访问等)。

答案 1 :(得分:0)

我认为你可以尝试这个来检查ajax调用的错误。

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

根据jqXHR.status值,您可以显示自定义的错误消息。