Как отобразить сообщение об ошибке, используя обработчик ошибок MVC (Customized) и jqgrid Load error trigger

Я работаю над приложением ASP.net MVC 2.0 и использую в нем jqgrid.

Я использую следующий код для обработки исключений во время запросов AJAX для загрузки сетки

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

Это показывает предупреждение, когда ошибка возникает во время запросов AJAX.

Но здесь я не хочу использовать xhr.responseTest для отображения описания ошибки, скорее, я использую Custom Error Handler, который переопределяет атрибут HandleError по умолчанию MVC следующим образом:

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**

он не отображает сообщение об ошибке, а отображается как неопределенный, что означает, что ответ json от обработчика CustomError не получен

Пожалуйста, помогите или дайте какие-либо предположения о том, как реализовать выше.

1 ответ

Решение

Обратный звонок loadError содержит те же параметры, что и error обратный вызов jQuery.ajax: jqXHR типа jqXHR (расширенный набор объекта XMLHTTPRequest), строка textStatus и строка errorThrown, Таким образом, для доступа к ответу JSON вы должны позвонить $.parseJSON(jqXHR.responseText) в явном виде. Ты можешь использовать jqXHR.getResponseHeader("Content-Type") Внутри loadError дополнительно проверить, что вы пытаетесь интерпретировать ответ об ошибке от сервера как ответ JSON, только если "Content-Type" является "application/json" или же "application/json; charset=utf-8", Вы можете сначала убедиться, что jqXHR.getResponseHeader("Content-Type") возвращает строку (а не null или же undefined), а затем использовать .split(";")[0] получить "application/json" часть без charset=utf-8,

Другие вопросы по тегам