如何将自定义错误信息从ASP.NET MVC3 JsonResult方法到错误(或成功或完成,如果需要)jQuery.ajax()的函数?理想情况下,我想要能够:
>仍然在服务器上抛出错误(这用于日志记录)
>在客户端上检索有关错误的自定义信息
这里是我的代码的基本版本:
控制器JsonResult方法
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); }
JavaScript
$.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块中返回错误信息
>这工作,但异常不能抛出
>在catch块中编辑HTTP响应
>然后在jQuery错误处理程序中检查xhr
> xhr.getResponseHeader()等包含默认的ASP.NET错误页面,但没有我的信息
>我认为这可能是可能的,但我只是做错了吗?
您可以编写自定义错误过滤器:
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" },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",success: function(data) { //Success handling } });
另一种可能性是适配a global exception handler I presented,以便在ErrorController内部检查它是否是一个AJAX请求,并简单地返回JSON的异常细节。