小编典典

我可以将自定义错误从JsonResult返回到jQuery ajax错误方法吗?

ajax

如何将自定义错误信息从ASP.NETMVC3JsonResult方法传递给的errorsuccesscomplete,如果需要的话)函数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响应
    • 然后xhr在jQuery错误处理程序中检查
    • xhr.getResponseHeader()等包含默认的ASP.NET错误页面,但我没有任何信息
    • 我认为这有可能,但我做错了吗?

阅读 240

收藏
2020-07-26

共1个答案

小编典典

您可以编写一个自定义错误过滤器:

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返回。

2020-07-26