#asp.net-mvc-3 #error-handling
#asp.net-mvc-3 #обработка ошибок
Вопрос:
Я ищу хороший / умный / чистый способ глобальной обработки ошибок, чтобы, если запрос выполнен в формате Json и возникает исключение, результатом должен быть json, а не html.
Ищу либо существующие решения, либо некоторую информацию о том, как создать свое собственное.
Ответ №1:
Один из распространенных способов сделать это — написать пользовательский фильтр исключений:
public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.Result = new JsonResult
{
Data = new { success = false, error = filterContext.Exception.ToString() },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
который может быть зарегистрирован как глобальный фильтр в Global.asax. А затем просто запросить некоторое действие:
$.getJSON('/someController/someAction', function (result) {
if (!result.success) {
alert(result.error);
} else {
// handle the success
}
});
Комментарии:
1. Разве это не выполнялось бы для каждого исключения?
2. @Dashu, да для каждого исключения. Вы также могли бы проверить, был ли запрос AJAX-запросом и был ли тип содержимого запроса application / json, и только в этом случае обработать исключение.
3. Интересно, но как вы можете получить свой результат по
Ajax.Error
событию? Идея, которую вы опубликовали, заключалась в использовании$.getJson
, так как бы вы это сделали, используя полный $.ajax, включаяerror
событие?4. @AdrianoRR, событие ошибки запускается, только если с сервера отправлено значение, отличное от 200.
5. @Darin, я это знаю. Вот почему я спрашиваю, как я могу вернуть данные JsonResult в событие ошибки ajax. Другое дело, если бы он достиг события onException, не выдало бы ли это ошибку, отличную от 200?
Ответ №2:
Вероятно, это выполнимо с помощью пользовательского атрибута… может быть, даже подкласс HandleErrorAttribute
. Хитрость будет заключаться в том, как узнать, собиралось ли действие контроллера вернуть JSON или нет. Это может быть так же просто, как добавление суффикса к именам методов, таким как GetCustomerDetailsJson
.