如何使用MVC错误处理程序(自定义)和jqgrid加载错误触发器显示错误消息

时间:2013-11-27 08:55:53

标签: c# asp.net-mvc jqgrid error-handling custom-error-handling

我正在研究ASP.net MVC 2.0应用程序并在其中使用jqgrid。

我正在使用以下代码来处理加载网格的ajax请求期间的异常

 loadError:function(xhr,status,error)
{
  alert("some thing wrong has happened"+xhr.responseTest);
}

在ajax请求期间引发错误时显示警告。

但是,在这里我不想使用xhr.responseTest来显示错误描述,而是使用自定义错误处理程序,它以下列方式覆盖MVC的默认HandleError属性:

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);                                                
                //filterContext.ExceptionHandled = true;
                //filterContext.Result = new JsonResult
                //{
                //    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                //    Data = new
                //    {
                //        error = true,
                //        message = filterContext.Exception.Message
                //    }
                //};
            }
            else
            {
                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
                };
            }
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }

        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};}
    }

我正在使用[CustomHandleError]过滤器来处理控制器操作的异常。

因为,可以看到请求是否是ajax请求,我正在抛出一些包含错误信息的json响应。 (上述代码中的数据(错误信息)

我收到了确切的错误信息到Data变量并设置了适当的json错误响应,

但是,问题是我无法在客户端捕获json并显示该错误消息而不是使用xhr.responseText。

我尝试了以下方式:但这不起作用:

loadError:function(Error)
    {
      alert("some thing wrong has happened"+Error.ErrorMessage);
    }

警报即将发布:

some thing wrong has happened+ **undefined**

它没有显示错误消息,而是显示为Undefined,这意味着没有收到来自CustomError Handler的json响应

请帮助或提供有关如何实施上述内容的任何建议。

1 个答案:

答案 0 :(得分:1)

回调loadError包含与jQuery.ajaxerror回调相同的参数:jqXHR类型的jqXHR({{3}的超集对象),字符串textStatus和字符串errorThrown。因此,要访问JSON响应,您应该明确地调用$.parseJSON(jqXHR.responseText)。您可以使用jqXHR.getResponseHeader("Content-Type")内的loadError来验证您是否仅在"Content-Type""application/json"或{{1}时尝试将服务器的错误响应解释为JSON响应}。您可以先验证"application/json; charset=utf-8"是否返回字符串(而不是jqXHR.getResponseHeader("Content-Type")null),然后使用undefined获取.split(";")[0]部分而不"application/json"