При возникновении ошибки в моем приложении ASP.NET MVC 4 я хотел бы настроить представление для пользователя в зависимости от типа ошибки. Например, страница не найдена или исключение (с некоторыми удобными для пользователя сведениями об исключении). Я проверил другие примеры того, как это сделать в StackOverflow и других онлайн-источниках, но ни один из ответов не работает для меня.
Базовый атрибут [HandleError], похоже, не работает в VS2012 с приложением MVC 4, ориентированным на .NET 4.5. Вот код, который у меня есть в моем домашнем контроллере:
[HandleError]
public ActionResult Index()
{
Response.TrySkipIisCustomErrors = true; //doesn't work with or without this
throw new NullReferenceException("Uh oh, something broke.");
}
Это просто бросает исключение, и я ожидаю, что представление по умолчанию ~/Shared/Error.cshtml будет возвращено из-за атрибута [HandleError], но все, что я получаю, это ошибка внутреннего сервера HTTP 500, указывающая, что страница не отображается. Я проверил свой web.config, и разные конфигурации, похоже, ведут себя странно. В этом разделе в настоящее время содержится:
<customErrors mode="On" />
(Я попытался добавить defaultRedirect и с режимом customErrors = "Off", но это не имело никакого эффекта... не отображается общий доступ к просмотру ошибок или представление CustomError. Если я изменяю customErrors режим выключен, тогда я вижу детали исключения, как ожидалось, поэтому он правильно выбрасывает исключение "Uh oh, something broken".
Я также попытался добавить обработчик OnException в HomeController, и хотя я могу отлаживать и видеть, что событие OnException поднимается, это не имеет никакого значения:
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
filterContext.ExceptionHandled = true;
if (filterContext == null)
{
filterContext.Result = View("CustomError");
return;
}
Exception e = filterContext.Exception;
// TODO: Log the exception here
ViewData["Exception"] = e; // pass the exception to the view
filterContext.Result = View("CustomError");
}
Я также попытался изменить [HandleError], чтобы указать представление, но это тоже ничего не делает:
[HandleError(View="CustomError")]
Любая помощь будет высоко оценена. Пожалуйста, дайте мне знать, если вам нужны подробности.