2

我正在使用 CustomErrorHandler 属性来处理我的 asp.net mvc 应用程序中的错误。代码如下:

 public class CustomHandleErrorAttribute : HandleErrorAttribute    // Error handler 
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }
            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                return;
            }
            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            // if the request is AJAX return JSON else view.
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = AjaxError(filterContext.Exception.Message, filterContext);
            }
            else
            {
                filterContext.ExceptionHandled = true;
                var controllerName = (string)filterContext.RouteData.Values["controller"];
                var actionName = (string)filterContext.RouteData.Values["action"];
                var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

                filterContext.Result = new ViewResult
                {
                    ViewName = View,
                    MasterName = Master,
                    ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                    TempData = filterContext.Controller.TempData
                };
            }

        }
        protected JsonResult AjaxError(string message, ExceptionContext filterContext)
        {
            if (String.IsNullOrEmpty(message))
                message = "Something went wrong while processing your request. Please refresh the page and try again.";
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            return new JsonResult { Data = new { ErrorMessage = message }, ContentEncoding = System.Text.Encoding.UTF8, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        }
    }
}

它具有捕获正常错误和 Ajax 错误的能力。

如果出现正常错误,我正在构建错误模型并显示错误视图

但是,如果出现 Ajax 错误,我想以 JSON 的形式显示错误消息。

我尝试了一些类似的东西:

function Failed(data) {  // Onfailed call of MVC Ajax form
        alert("Sorry,An error occured while processing your request");
        alert(data.ErrorMessage);
    }

但是,它表示data.ErrorMessage未定义,而不是显示实际的错误消息。

请帮助/建议如何处理这个问题。

更新2: 这就是它的解决方法:

 function Failed(jqXHR, textStatus, errorThrown) {
        var Error = $.parseJSON(jqXHR.responseText);
        alert("Sorry,An error occured while processing your request");
        alert(Error.ErrorMessage);
    }
4

2 回答 2

3

我觉得奇怪的是,您想在出现 Ajax 错误的情况下显示一些HTML 表单。Ajax 请求通常使用jQuery.ajax.fail()的方法或error回调来获取错误信息。在回调内部,可以使用解码服务器响应,然后显示一些错误消息,例如或更复杂的对话框。我想您当前代码中的主要问题是因为您没有在代码中设置 Ajax 请求。var error = $.parseJSON(jqXHR.responseText);alert(error.ErrorMessage);filterContext.ExceptionHandled = true;

对您当前代码的小评论:我认为您可以安全地使用IsAjaxRequest扩展(在表单中if (filterContext.HttpContext.Request.IsAjaxRequest()) {...})而不是测试.Headers["X-Requested-With"]

于 2013-12-09T17:08:04.317 回答
1

看起来你没有正确地形成 return 语句。在您的 JsonResult 操作中,尝试:

var returnObj = new { ErrorMessage = message };
return Json(returnObj, JsonRequestBehavior = JsonRequestBehavior.AllowGet);

如果这不能解决问题:

  • 对 JavaScript 中的 AJAX 响应对象执行 console.log。
  • 确保您访问的是正确的属性名称。
  • 确保 JavaScript 将您的返回识别为有效对象。如果它仍然是字符串形式,您可能需要执行以下操作:

    var returnedObj = JSON.parse(jsonString);
    

例子

我的一个 webAPI 控制器的响应的 console.log 产生了这个:

json响应

JSON 对象在响应属性之一中采用字符串形式。我得到了我想要的对象:

var returnedObj = JSON.parse(response.responseText);

返回Obj 的console.log 产生:

在此处输入图像描述

于 2013-12-09T16:15:18.517 回答