我的问题的实质是:如果我向服务器发出$ .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 :(得分: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
值,您可以显示自定义的错误消息。