CustomErrors не перенаправляет на настраиваемую страницу, а на страницу ошибки MVC по умолчанию

У меня есть новое решение MVC 4.0, созданное с нуля с использованием веб-экспресса VS2012 и IIS Express. Как говорится в плитке, я изменил свой web.config и добавил следующее:

<customErrors defaultRedirect="Errors/GenericError.html" mode="On">
    <error statusCode="404" redirect="Errors/Error404.html"/>
</customErrors>

В основном, когда я получаю исключение в своем контроллере, MVC error.cshtml по умолчанию показывает ошибку вместо моей пользовательской страницы GenericError.html.

Если я перехожу к несуществующему URL-адресу, мой Error404.html отображается правильно, но не для общего сценария.

Любые идеи, как я могу изменить это поведение?


person Jay    schedule 17.04.2013    source источник


Ответы (1)


Похоже, у вас нет атрибута ошибки в ваших глобальных фильтрах. В проекте MVC 4 вы должны иметь возможность искать класс FilterConfig, который был сгенерирован для вас:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

Обновление:

Глобальный фильтр HandleErrorAttribute предназначен для ошибок, возникающих в конвейере MVC, таких как ошибки в вашем контроллере, как вы упомянули.

Элемент customErrors в web.config предназначен для всего остального. HandleErrorAttribute не будет учитывать значение, которое вы указали в атрибуте defaultRedirect для customErrors.

Фильтр HandleError будет искать общее представление, которое должно быть в вашем сгенерированном проекте shared\Error.cshtml. Вы можете указать ему другое представление, установив свойство для атрибута.

Например, допустим, мы создаем новое представление под Shared\Errors\CustomError.cshtml, тогда вы можете зарегистрировать фильтр следующим образом:

filters.Add(new HandleErrorAttribute(){View = "Errors/CustomError"});
person Nathan    schedule 17.04.2013
comment
Мое решение было полностью сгенерировано из шаблона, поэтому оно есть в AppStart/FilterConfig.cs. В противном случае он даже не показывал бы страницу с ошибкой в ​​общих представлениях, я думаю? Это мой FilterConfig.cs: использование System.Web; используя System.Web.Mvc; пространство имен MyNamespace { открытый класс FilterConfig { public static void RegisterGlobalFilters (фильтры GlobalFilterCollection) { filter.Add (новый атрибут HandleErrorAttribute ()); } } } - person Jay; 18.04.2013
comment
Хорошо, это именно то поведение, которое я испытываю, так что теперь, когда вы объяснили таким образом, я могу, по крайней мере, понять концепцию. Я поиграю с предложением, которое вы упомянули об использовании другого представления. Большое спасибо. Отметил как отвеченный. - person Jay; 18.04.2013
comment
Есть ли ссылки на то, как HandleErrorAttribute зависит от конвейера MVC? Например, когда путь ведет к несуществующему контроллеру, кажется, что это перехватывается customErrors в web.config, но разрешающие контроллеры должны быть внутри конвейера MVC, верно? - person Alex; 26.05.2014