ASP.NET MVC3 по-прежнему ищет Error.aspx / .cshtml, несмотря на указание моего собственного представления - PullRequest
4 голосов
/ 04 февраля 2012

У меня в приложении ASP.NET MVC 3 настроено перенаправление на контроллер Errors с двумя действиями -

<customErrors mode="On" defaultRedirect="/Errors/ApplicationError">
    <error statusCode="404" redirect="/Errors/NotFound" />
</customErrors>

У меня есть пара представлений для каждого из методов действия:

  • /Views/Shared/NotFound.cshtml
  • /Views/Shared/ApplicationError.cshtml

В своем действии ErrorsController ApplicationError я делаю следующее:

public ActionResult ApplicationError()
{
    Response.StatusCode = 500;
    return View();
}

Это работает, и мое ApplicationError.cshtml представление отображается, что бы ни случилось, регистрируется, все хорошо.

Однако в ELMAH я вижу, что эта дополнительная ошибка регистрируется:

System.InvalidOperationException Представление «Ошибка» или его мастер не были найдены, или ни один механизм представления не поддерживает искомые местоположения. Были найдены следующие местоположения: ~ / Views / Throw / Error.aspx ~ / Views / Throw / Error.ascx ~ / Views / Shared / Error.aspx ~ / Views / Shared / Error.ascx ~ / Views / Throw / Error. cshtml ~ / Views / Throw / Error.vbhtml ~ / Views / Shared / Error.cshtml ~ / Views / Shared / Error.vbhtml

Почему ASP.NET MVC все еще ищет эти представления, когда я уже обработал ошибку, и мое собственное представление успешно найдено и обработано?

Дополнительная информация:

1 Ответ

3 голосов
/ 05 февраля 2012

Я думаю, что хотя вы заменили HandleErrorAttribute производным классом (ElmahHandleErrorAttribute), ваш пользовательский атрибут OnException, вероятно, все еще вызывает base.OnException - т.е. HandleErrorAttribute.OnException.

HandleErrorAttribute.OnException полностью игнорирует настройки web.config (не позволяя ASP.NET отображать стандартный YSOD, если customErrors выключен) и устанавливает результат действия равным ViewResult с кодом состояния 500 и View установлен на «Ошибка» (по умолчанию, когда свойство View не было установлено для атрибута).

То есть, я предполагаю, что что-то подобное происходит:

  1. Вы бросаете исключение
  2. ElmahHandleErrorAttribute поднимает трубку, регистрирует исключение, звонит base.OnException
  3. HandleErrorAttribute.OnException устанавливает результат действия на ViewResult с View, установленным на "Ошибка"
  4. ViewEngine не может найти это представление «Ошибка», и поэтому выдает новое исключение
  5. ... который регистрируется ELMAH, но не принимается ElmahHandleErrorAttribute (потому что это исключение произошло вне действия)
  6. Вместо этого ASP.NET сам подхватывает его и использует errorPages в web.config
  7. ... вызов / Ошибки / ApplicationError
  8. ... который отображает нужный вам вид

... но на самом деле это не исключение, которое вы бросили, а исключение, которое бросил ViewEngine.

Возможно, вы захотите реализовать свою собственную обработку исключений, а не основывать ее на HandleError, если вы хотите, чтобы параметры web.config учитывались. Взгляните на HandleErrorAttribute в источниках MVC ( здесь ), чтобы увидеть, что нужно сделать (и что не следует делать в вашем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...