jQuery的Ajaxerror handling,显示自定义的exception消息
有没有什么方法可以显示自定义exception消息作为我的jQuery AJAX错误消息中的警报?
例如,如果我想通过throw new ApplicationException("User name already exists");
通过Struts在服务器端抛出exceptionthrow new ApplicationException("User name already exists");
,我想在jQuery AJAX错误消息中捕获此消息(“用户名已存在”)。
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); } }); } });
在第二个提醒,我提醒抛出的错误,我越来越undefined
,状态码是500。
我不知道我哪里错了。 我能做些什么来解决这个问题?
请确保您将Response.StatusCode
设置为200以外的内容。使用Response.Write
编写您的exception消息,然后使用…
xhr.responseText
..在你的JavaScript。
控制器:
public class ClientErrorHandler : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { var response = filterContext.RequestContext.HttpContext.Response; response.Write(filterContext.Exception.Message); response.ContentType = MediaTypeNames.Text.Plain; filterContext.ExceptionHandled = true; } } [ClientErrorHandler] public class SomeController : Controller { [HttpPost] public ActionResult SomeAction() { throw new Exception("Error message"); } }
查看脚本:
$.ajax({ type: "post", url: "/SomeController/SomeAction", success: function (data, text) { //... }, error: function (request, status, error) { alert(request.responseText); } });
服务器端:
doPost(HttpServletRequest request, HttpServletResponse response){ try{ //logic }catch(ApplicationException exception){ response.setStatus(400); response.getWriter().write(exception.getMessage()); //just added semicolon to end of line } }
客户端:
jQuery.ajax({// just showing error property error: function(jqXHR,error, errorThrown) { if(jqXHR.status&&jqXHR.status==400){ alert(jqXHR.responseText); }else{ alert("Something went wrong"); } } });
通用的Ajaxerror handling
如果我需要为所有的ajax请求做一些通用的error handling。 我将设置ajaxError处理程序,并将错误显示在HTML内容顶部的名为errorcontainer的div上。
$("div#errorcontainer") .ajaxError( function(e, x, settings, exception) { var message; var statusErrorMap = { '400' : "Server understood the request, but request content was invalid.", '401' : "Unauthorized access.", '403' : "Forbidden resource can't be accessed.", '500' : "Internal server error.", '503' : "Service unavailable." }; if (x.status) { message =statusErrorMap[x.status]; if(!message){ message="Unknown Error \n."; } }else if(exception=='parsererror'){ message="Error.\nParsing JSON Request failed."; }else if(exception=='timeout'){ message="Request Time out."; }else if(exception=='abort'){ message="Request was aborted by the server"; }else { message="Unknown Error \n."; } $(this).css("display","inline"); $(this).html(message); });
您需要将responseText
转换为JSON。 使用JQuery:
jsonValue = jQuery.parseJSON( jqXHR.responseText ); console.log(jsonValue.Message);
如果打电话给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) ); })
我发现这是很好的,因为我可以parsing出我从服务器发送的消息,并显示友好的消息给用户没有堆栈跟踪…
error: function (response) { var r = jQuery.parseJSON(response.responseText); alert("Message: " + r.Message); alert("StackTrace: " + r.StackTrace); alert("ExceptionType: " + r.ExceptionType); }
这是我做的,它在MVC 5应用程序中工作至今。
控制器的返回types是ContentResult。
public ContentResult DoSomething() { if(somethingIsTrue) { Response.StatusCode = 500 //Anything other than 2XX HTTP status codes should work Response.Write("My Message"); return new ContentResult(); } //Do something in here// string json = "whatever json goes here"; return new ContentResult{Content = json, ContentType = "application/json"}; }
而在客户端这是什么ajaxfunction看起来像
$.ajax({ type: "POST", url: URL, data: DATA, dataType: "json", success: function (json) { //Do something with the returned json object. }, error: function (xhr, status, errorThrown) { //Here the status code can be retrieved like; xhr.status; //The message added to Response object in Controller can be retrieved as following. xhr.responseText; } });
一般/可重用的解决scheme
这个答案是提供给所有那些遇到这个问题的未来参考。 解决scheme包含两件事情:
- 自定义exception
ModelStateException
在服务器上validation失败时引发(当我们使用数据注释并使用强types控制器操作参数时,模型状态报告validation错误) - 自定义控制器操作错误filter
HandleModelStateExceptionAttribute
捕获自定义exception,并返回HTTP错误状态和正文中的模型状态错误
这为jQuery Ajax调用提供了最佳的基础结构,以充分利用其success
和error
处理程序的潜力。
客户端代码
$.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 }
整个问题在这个博客文章中详细介绍,你可以find所有的代码来运行你的应用程序。
如果有人在2016年作为答案,请使用.fail()
进行error handling,因为.error()
从jQuery 3.0
$.ajax( "example.php" ) .done(function() { alert( "success" ); }) .fail(function(jqXHR, textStatus, errorThrown) { //handle error here })
我希望它有帮助
这可能是由JSON字段名称不带引号造成的。
从以下位置更改JSON结构:
{welcome:"Welcome"}
至:
{"welcome":"Welcome"}
我相信Ajax响应处理程序使用HTTP状态代码来检查是否有错误。
所以如果你只是在你的服务器端代码上抛出一个Javaexception,但是HTTP响应没有500状态码,那么jQuery(或者在这种情况下可能是XMLHttpRequest对象)会假设一切正常。
我这样说是因为我有一个ASP.NET类似的问题,我抛出了像一个ArgumentException(“不知道该怎么办…”),但error handling程序没有触发。
然后,我将Response.StatusCode
设置为500或200是否有错误。
jQuery.parseJSON对成功和错误非常有用。
$.ajax({ url: "controller/action", type: 'POST', success: function (data, textStatus, jqXHR) { var obj = jQuery.parseJSON(jqXHR.responseText); notify(data.toString()); notify(textStatus.toString()); }, error: function (data, textStatus, jqXHR) { notify(textStatus); } });
抛出一个新的exception在服务器上使用:
Response.StatusCode = 500
Response.StatusDescription = ex.Message()
我相信StatusDescription返回到Ajax调用…
例:
Try Dim file As String = Request.QueryString("file") If String.IsNullOrEmpty(file) Then Throw New Exception("File does not exist") Dim sTmpFolder As String = "Temp\" & Session.SessionID.ToString() sTmpFolder = IO.Path.Combine(Request.PhysicalApplicationPath(), sTmpFolder) file = IO.Path.Combine(sTmpFolder, file) If IO.File.Exists(file) Then IO.File.Delete(file) End If Catch ex As Exception Response.StatusCode = 500 Response.StatusDescription = ex.Message() End Try
$("#save").click(function(){ $("#save").ajaxError(function(event,xhr,settings,error){ $(this).html{'error: ' (xhr ?xhr.status : '')+ ' ' + (error ? error:'unknown') + 'page: '+settings.url); }); });
在xhr对象中有一个引发exception的JSON对象。 只是使用
alert(xhr.responseJSON.Message);
JSON对象公开了另外两个属性:'ExceptionType'和'StackTrace'
虽然问了这个问题已经很多年了,但是我仍然没有findxhr.responseText
作为我正在寻找的答案。 它以下面的格式返回了string:
"{"error":true,"message":"The user name or password is incorrect"}"
我绝对不想向用户展示。 我正在寻找的东西如下所示:
alert(xhr.responseJSON.message);
xhr.responseJSON.message
给我从Json对象中可以显示给用户的确切消息。
$("#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 }); });
如果有任何forms提交与validation
只需使用其余的代码
$("#fmlogin").validate({...
... ... });
首先,我们需要在web.config中设置<serviceDebug includeExceptionDetailInFaults =“True”/>:
<serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" /> **<serviceDebug includeExceptionDetailInFaults="true" />** </behavior> </serviceBehaviors>
除了在jQuery的水平错误的一部分,你需要parsing包含exception的错误响应,如:
.error(function (response, q, t) { var r = jQuery.parseJSON(response.responseText); });
然后使用r.Message你可以动手显示exception文本。
检查完整的代码: http : //www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html