MVC3 HandleError не показывает страницу с ошибкой - PullRequest
3 голосов
/ 10 мая 2011

Я следовал этому руководству для атрибута HandleError: blogs.msdn.com , который я использую следующим образом (AccountController):

[HandleError(View="ErasErrorPage")]
        public ActionResult Index()
        {
            ViewBag.admins = _accountMapper.GetAdmins(false);
            ViewBag.members = _accountMapper.GetMembers(false);
            ViewBag.Countries = _countryMapper.GetCountries();

            return View();
        }

Этот код вызывает исключение, поскольку_accountMapper.GetAdmins(false) происходит сбой из-за System.Data.EntityException.

Я поместил представление ErasErrorPage в свою общую папку и добавил <customErrors mode="On"/>, но ErasErrorPage не отображается.Все, что я получаю, когда возникает ошибка, это желтый экран смерти, говорящий:

Error Очевидно, что установка режима в «Выкл» или «RemoteOnly» не решает проблему.

У кого-нибудь есть идея, почему это не работает?

РЕДАКТИРОВАТЬ

Если я перехожу прямо к http://localhost:3527/Account/Index,, я получаю правильный ErasErrorPage, но я этого не хочу,Я хочу, чтобы веб-сайт автоматически перенаправлял на эту страницу при возникновении исключения.Возможно ли это?

EDIT2

Я поместил атрибут [HandleError(View="ErasErrorPage")] прямо перед каждым методом Public ActionResult methodName() { ... }, и у меня все еще появляется желтый экранof Death, говоря, что мне нужно изменить режим на «Off» или «RemoteOnly» ...

Ответы [ 3 ]

3 голосов
/ 13 мая 2011

Поскольку это вообще не работает, я нашел очень хорошую альтернативу:

Пользовательские страницы ошибок на asp.net MVC3

Я также нашелпочему это не удалось:

Мы пытались подключиться к базе данных, прежде чем пытались отрисовывать представления.Атрибут HandleError даже не будет вызван этим (я думаю).Метод выше делает это.Он обрабатывает любые исключения в любом месте.

3 голосов
/ 10 мая 2011

Убедитесь, что представление ErasErrorPage само по себе не вызывает исключение. Вот шаги, которые я сделал и которые работали хорошо для меня:

  1. Создание нового проекта ASP.NET MVC 3 с использованием мастера Visual Studio по умолчанию
  2. Добавить ~/Views/Shared/ErasErrorPage.cshtml со следующим содержанием:

    @{
        Layout = null;
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>ErasErrorPage</title>
    </head>
    <body>
        <div>
            OOPS
        </div>
    </body>
    </html>
    
  3. Измените HomeContoller, чтобы он выглядел следующим образом:

    public class HomeController : Controller
    {
        [HandleError(View = "ErasErrorPage")]
        public ActionResult Index()
        {
            throw new Exception("oops");
        }
    }
    
  4. В web.config положить:

    <customErrors mode="On" />
    
  5. Перейдите к /Home/Index => пользовательская страница ошибки отображается, как и ожидалось

1 голос
/ 26 ноября 2012

Это работает, у меня есть BaseController с атрибутом [HandleError(View = "Error")] и представлением ошибок в Shared с динамической моделью (должно быть HandleErrorInfo), а при действии Index в HomeController я выкидываю исключение:

throw new Exception("Test exception");

Затем отображается представление ошибки и отображается правильная информация.

ErrorView:

<div class="errorMessage">
    <h1 class="errorHeader">@Model.Exception.GetType().Name</h1>
    <cite class="errorAction">thrown in @Model.ControllerName @Model.ActionName</cite>
    <p class="errorMessage">thrown in @Model.Message</p>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...