атрибут, кажется, не действует вообще - PullRequest
11 голосов
/ 08 февраля 2009

У меня проблемы с использованием атрибута [HandleError] в действиях моего контроллера - похоже, он вообще не работает (то есть не имеет значения, есть фильтр или нет - я получаю те же результаты ... ). Когда выдается исключение, я получаю стандартную страницу «Ошибка сервера» красного цвета на странице «/» приложения вместо моего настраиваемого представления.

Я нашел несколько других тем на эту тему здесь, на SO, и в большинстве случаев кажется, что установка параметра customErrors в On в web.config решила проблему. Это не для меня, поэтому мне нужно найти другое решение.

Мое действие контроллера:

[HandleError]
public ActionResult Index()
{
    throw new Exception("oops...");
    return View();
}

В моем файле web.config

<customErrors mode="On"></customErrors>

Я убедился, что файл Error.aspx также находится в каталоге Shared. Чего мне не хватает?

Я использую обновление ASP.NET MVC RC.

Ответы [ 6 ]

13 голосов
/ 09 февраля 2009

Две полезные вещи, которые нужно знать:

По умолчанию HandleError ничего не делает при работе под сервером разработки. Намерение состоит в том, чтобы показать разработчикам более полезную информацию:

public virtual void OnException(ExceptionContext filterContext) {
    if (filterContext == null) {
        throw new ArgumentNullException("filterContext");
    }

    // If custom errors are disabled, we need to let the normal ASP.NET
    // exception handler execute so that the user can see useful
    // debugging information.
    if (filterContext.ExceptionHandled
        || ! filterContext.HttpContext.IsCustomErrorEnabled) {
        return;
    }

Обратите внимание, что именно этот случай и должен контролировать customError. Если настройка customError="On" не меняет это поведение:

  1. Проверьте ваш синтаксис.
  2. Убедитесь, что вы редактируете Web.config в корне проекта, а не в представлениях.
  3. Убедитесь, что кодовые наборы отсутствуют HttpContext.IsCustomErrorEnabled.
  4. Если ничего не помогает, попробуйте отключить отладку в Web.config

Во-вторых, существуют определенные типы ошибок, которые HandleError никогда не будут обрабатывать, особенно ошибки компиляции ASP.NET. Вы не говорите, с какой ошибкой вы столкнулись.

3 голосов
/ 05 мая 2009

У меня возникла та же проблема, и мне потребовалось два полных дня, чтобы окончательно ее решить. Оказалось, что я получил ошибку на странице Site.Master, и Error.aspx использовал эту же главную страницу, как и все другие страницы. Очевидно, Error.aspx не может справиться с такой ситуацией.

Мое решение состоит в том, чтобы создать определенную страницу Error.master, которая является легкой и не содержит никаких данных модели. Кроме того, я создал статический Error.htm в случае возникновения ошибки из Error.aspx. Параметр Web.config имеет следующий вид:

<customErrors mode="On">
    <error statusCode="500" redirect="Error.htm" />
</customErrors>

Надеюсь, это поможет.

3 голосов
/ 08 февраля 2009

Вы также должны указать, на какую страницу перенаправлять.

<customErrors mode="On" defaultRedirect="Error.aspx" />

РЕДАКТИРОВАТЬ: Извините, что / Shared / part не должен делать ставки там, но вы должны указать MVC, на какую страницу отправить пользователя с Error.aspx. Затем маршрут по умолчанию ищет что-то с именем Error.aspx в shared.

Было очень поздно! :) Наверное, поэтому кто-то дал мне минус за ответ! :) По крайней мере, здесь работает, приятель!

0 голосов
/ 11 июля 2011

Я попробовал вышеуказанные предложения, но у меня ничего не получалось. Что за хитрость удаляла эту строку из моих действий в контроллере ошибок.

Response.StatusCode = (int)HttpStatusCode.NotFound;

Я выдернул волосы, поскольку сообщения об ошибках IIS перехватывали мою обработку ошибок. И хотя это не идеально, так как я хочу предоставить этот код состояния в своем ответе, я обнаружил, что его удаление не позволяет IIS 7+ мешать моей обработке ошибок.

DaTribe

0 голосов
/ 29 сентября 2010

Чтобы обойти проблему 404, когда предполагалось показать Error.aspx, мне пришлось исключить Error.aspx из раздела httpHandler, который препятствовал прямому доступу к любым представлениям (в среде mvc 2). Я сделал это, поместив Error.aspx в подпапку «Error» и поместив web.config в эту подпапку с <remove path="*" verb="*" /> в разделе httpHandlers. Моя версия этой проблемы (и ее решение) может быть специфичной для MVC 2.

Не забудьте обновить ссылку defaultRedirect при перемещении Error.aspx:)

0 голосов
/ 27 июля 2009

Другая причина этой проблемы может быть

В шаблонном приложении MVC (создан VS2008 / VS2008 Express) Error.aspx (создан VS) использует мастер-страницу.

Если главная страница получит доступ к каким-либо данным ViewData, она выдаст исключение с нулевой ссылкой, тогда ошибка.

Используйте этот простой код в качестве Error.aspx, он решит проблему (вместе с CustomErrors = On)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
...