有什么方法可以在jQueryAJAX错误消息中显示自定义异常消息作为警报吗?
例如,如果我想通过抛出新的ApplicationException(“用户名已经存在”),通过Struts在服务器端抛出异常;,我想在jQueryAJAX错误消息中捕获此消息(“用户名已存在”)。
jQuery("#save").click(function () {
if (jQuery('#form').jVal()) {
jQuery.ajax({
type: "POST",
url: "saveuser.do",
dataType: "html",
data: "userId=" + encodeURIComponent(trim(document.forms[0].userId.value)),
success: function (response) {
jQuery("#usergrid").trigger("reloadGrid");
clear();
alert("Details saved successfully!!!");
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
}
});
在错误回调中的第二个警报中,我向thrownError发出警报,我得到了未定义,xhr.status代码为500。
我不知道我错在哪里。我可以做什么来解决这个问题?
首先,我们需要在web.config中设置<serviceDebug includeExceptionDetailInFaults=“True”/>:
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
**<serviceDebug includeExceptionDetailInFaults="true" />**
</behavior>
</serviceBehaviors>
除了jquery级别的错误部分,您还需要解析包含异常的错误响应,如:
.error(function (response, q, t) {
var r = jQuery.parseJSON(response.responseText);
});
然后使用r.Message,您可以实际显示异常文本。
检查完整代码:http://www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html
$("#fmlogin").submit(function(){
$("#fmlogin").ajaxError(function(event,xhr,settings,error){
$("#loading").fadeOut('fast');
$("#showdata").fadeIn('slow');
$("#showdata").html('Error please, try again later or reload the Page. Reason: ' + xhr.status);
setTimeout(function() {$("#showdata").fadeOut({"opacity":"0"})} , 5500 + 1000); // delays 1 sec after the previous one
});
});
如果有任何表单,请提交并验证
只需使用代码的其余部分
$("#fmlogin").validate({...
......});
通用/可重复使用的解决方案
这个答案是为将来遇到这个问题的所有人提供的参考。解决方案由两部分组成:
在服务器上验证失败时引发的自定义异常ModelStateException(当我们使用数据注释并使用强类型控制器操作参数时,模型状态报告验证错误)自定义控制器操作错误筛选器HandleModelStateExceptionAttribute,它捕获自定义异常并返回HTTP错误状态,主体中包含模型状态错误
这为jQueryAjax调用提供了最佳的基础设施,以便在成功和错误处理程序中充分发挥其潜力。
客户端代码
$.ajax({
type: "POST",
url: "some/url",
success: function(data, status, xhr) {
// handle success
},
error: function(xhr, status, error) {
// handle error
}
});
服务器端代码
[HandleModelStateException]
public ActionResult Create(User user)
{
if (!this.ModelState.IsValid)
{
throw new ModelStateException(this.ModelState);
}
// create new user because validation was successful
}
整个问题在这篇博客文章中有详细介绍,您可以在其中找到在应用程序中运行此功能的所有代码。
如果调用asp.net,将返回错误消息标题:
我没有自己编写所有的formatErrorMessage,但我发现它非常有用。
function formatErrorMessage(jqXHR, exception) {
if (jqXHR.status === 0) {
return ('Not connected.\nPlease verify your network connection.');
} else if (jqXHR.status == 404) {
return ('The requested page not found. [404]');
} else if (jqXHR.status == 500) {
return ('Internal Server Error [500].');
} else if (exception === 'parsererror') {
return ('Requested JSON parse failed.');
} else if (exception === 'timeout') {
return ('Time out error.');
} else if (exception === 'abort') {
return ('Ajax request aborted.');
} else {
return ('Uncaught Error.\n' + jqXHR.responseText);
}
}
var jqxhr = $.post(addresshere, function() {
alert("success");
})
.done(function() { alert("second success"); })
.fail(function(xhr, err) {
var responseTitle= $(xhr.responseText).filter('title').get(0);
alert($(responseTitle).text() + "\n" + formatErrorMessage(xhr, err) );
})