我的问题的实质是:如果我向服务器发出$.ajax请求以进行服务器端验证 – 我应该如何处理验证响应?我认为自己有两种选择:
// Server handled error:
$.ajax({
url: 'controller/action',data: {},success: function(response){
console.log("Error:",response.error);
}
}
// Server unhandled error:
$.ajax({
url: 'controller/action',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
});
}
最佳答案
我在我的系统中做了类似的事情.成功总是返回如下数据:
$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) {}
}});
你可以变得更疯狂,并将它们添加为全局AJAX处理程序,并将此代码添加到$(document).ajaxComplete();打回来.
您可以并且应该为ajax错误回调设置单独的处理程序,因为这可能包括控制器代码无法控制的情况(404错误,服务器无法访问等).