如何将自定义错误信息从ASP.NETMVC3JsonResult方法传递给的error(success或complete,如果需要的话)函数jQuery.ajax()?理想情况下,我希望能够:
JsonResult
error
success
complete
jQuery.ajax()
这是我的代码的基本版本:
public JsonResult DoStuff(string argString) { string errorInfo = ""; try { DoOtherStuff(argString); } catch(Exception e) { errorInfo = "Failed to call DoOtherStuff()"; //Edit HTTP Response here to include 'errorInfo' ? throw e; } return Json(true); }
$.ajax({ type: "POST", url: "../MyController/DoStuff", data: {argString: "arg string"}, dataType: "json", traditional: true, success: function(data, statusCode, xhr){ if (data === true) //Success handling else //Error handling here? But error still needs to be thrown on server... }, error: function(xhr, errorType, exception) { //Here 'exception' is 'Internal Server Error' //Haven't had luck editing the Response on the server to pass something here } });
我尝试过的事情(没有解决):
catch
xhr
xhr.getResponseHeader()
您可以编写一个自定义错误过滤器:
public class JsonExceptionFilterAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) { filterContext.HttpContext.Response.StatusCode = 500; filterContext.ExceptionHandled = true; filterContext.Result = new JsonResult { Data = new { // obviously here you could include whatever information you want about the exception // for example if you have some custom exceptions you could test // the type of the actual exception and extract additional data // For the sake of simplicity let's suppose that we want to // send only the exception message to the client errorMessage = filterContext.Exception.Message }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } } }
然后将其注册为全局过滤器,或者仅应用于您打算用AJAX调用的特定控制器/动作。
在客户端上:
$.ajax({ type: "POST", url: "@Url.Action("DoStuff", "My")", data: { argString: "arg string" }, dataType: "json", traditional: true, success: function(data) { //Success handling }, error: function(xhr) { try { // a try/catch is recommended as the error handler // could occur in many events and there might not be // a JSON response from the server var json = $.parseJSON(xhr.responseText); alert(json.errorMessage); } catch(e) { alert('something bad happened'); } } });
显然,您可能很快就无聊为每个AJAX请求编写重复的错误处理代码,因此最好为页面上的所有AJAX请求编写一次:
$(document).ajaxError(function (evt, xhr) { try { var json = $.parseJSON(xhr.responseText); alert(json.errorMessage); } catch (e) { alert('something bad happened'); } });
然后:
$.ajax({ type: "POST", url: "@Url.Action("DoStuff", "My")", data: { argString: "arg string" }, dataType: "json", traditional: true, success: function(data) { //Success handling } });
另一种可能性是改编[我介绍的全局异常处理程序,以便在ErrorController内检查它是否是AJAX请求,并简单地将异常详细信息作为JSON返回。