Как отобразить сообщение об ошибке, используя обработчик ошибок 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
,