У меня есть базовый код для определения ошибок в моем приложении MVC. В настоящее время в моем проекте у меня есть контроллер , называемый Error
с методами действий HTTPError404()
, HTTPError500()
и General()
. Все они принимают строковый параметр error
. Использование или изменение кода ниже. Каков наилучший / правильный способ передать данные контроллеру ошибок для обработки? Я хотел бы иметь как можно более надежное решение.
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (httpException.GetHttpCode())
{
case 404:
// page not found
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// server error
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "General");
break;
}
routeData.Values.Add("error", exception);
// clear error on server
Server.ClearError();
// at this point how to properly pass route data to error controller?
}
}
Чтобы ответить на первоначальный вопрос «как правильно передать маршрутизируемые данные контроллеру ошибок?»:
Затем в своем классе ErrorController реализуйте такую функцию:
Это помещает исключение в представление. Страница просмотра должна быть объявлена следующим образом:
И код для отображения ошибки:
Вот функция, которая собирает все сообщения об исключениях из дерева исключений:
источник
Я нашел решение проблемы с ajax, отмеченное Lion_cl.
global.asax:
ErrorPagesController
AjaxRedirectResult
AjaxRequestExtension
источник
Раньше я боролся с идеей централизации процедуры глобальной обработки ошибок в приложении MVC. У меня есть сообщение на форумах ASP.NET .
Он в основном обрабатывает все ошибки вашего приложения в global.asax без необходимости использования контроллера ошибок, украшения с помощью
[HandlerError]
атрибута или возни сcustomErrors
узлом в web.config.источник
Возможно, лучший способ обработки ошибок в MVC - применить атрибут HandleError к вашему контроллеру или действию и обновить файл Shared / Error.aspx, чтобы делать то, что вы хотите. Объект Model на этой странице включает свойство Exception, а также ControllerName и ActionName.
источник
404
ошибкой? поскольку для этого нет контроллера / действия?Perhaps a better way of handling errors
звучит очень похоже на все ошибки, а не только на 500.Application_Error имеет проблему с запросами Ajax. Если ошибка обработана в Action, вызываемом Ajax, он отобразит ваш Error View внутри полученного контейнера.
источник
Это может быть не лучший способ для MVC ( https://stackoverflow.com/a/9461386/5869805 )
Ниже показано, как вы визуализируете представление в Application_Error и записываете его в ответ http. Вам не нужно использовать перенаправление. Это предотвратит второй запрос к серверу, поэтому ссылка в адресной строке браузера останется прежней. Это может быть хорошо или плохо, все зависит от того, чего вы хотите.
Global.asax.cs
Посмотреть
источник
Брайан, этот подход отлично подходит для запросов, отличных от Ajax, но, как заявил Lion_cl, если у вас есть ошибка во время вызова Ajax, ваше представление Share / Error.aspx (или ваше настраиваемое представление страницы с ошибкой) будет возвращено вызывающей стороне Ajax - -пользователь НЕ будет перенаправлен на страницу с ошибкой.
источник
Используйте следующий код для перенаправления на страницу маршрута. Используйте exception.Message как признак исключения. Строка запроса исключения Coz дает ошибку, если она увеличивает длину строки запроса.
источник
У меня проблема с этим подходом к обработке ошибок: В случае web.config:
Обработчик ошибок выполняет поиск в представлении Error.shtml и шаге потока управления в Application_Error global.asax только после исключения
Так
httpException всегда имеет значение null, тогда customErrors mode = "On" :( Это вводит в заблуждение Тогда
<customErrors mode="Off"/>
или<customErrors mode="RemoteOnly"/>
пользователи видят customErrors html, Then customErrors mode = "On", этот код тоже неверенЕще одна проблема этого кода:
Страница возврата с кодом 302 вместо реального кода ошибки (402,403 и т. Д.)
источник