2012-07-03 4 views
5

Использование блога here и темы here на SO Я создал контроллер, который должен обрабатывать все мои страницы ошибок.MVC3 Пользовательские страницы ошибок дают пустой результат

В моем Global.asax.cs я получил следующий фрагмент кода:

protected void Application_Error() 
     { 
      var exception = Server.GetLastError(); 
      var httpException = exception as HttpException; 
      var routeData = new RouteData(); 

      Response.Clear(); 
      Server.ClearError(); 

      routeData.Values["controller"] = "Error"; 
      routeData.Values["action"] = "General"; 
      routeData.Values["exception"] = exception; 
      Response.StatusCode = 500; 

      if (httpException != null) 
      { 
       Response.StatusCode = httpException.GetHttpCode(); 
       switch (Response.StatusCode) 
       { 
        case 403: 
         routeData.Values["action"] = "Http403"; 
         break; 
        case 404: 
         routeData.Values["action"] = "Http404"; 
         break; 
       } 
      } 

      // Avoid IIS7 getting in the middle 
      Response.TrySkipIisCustomErrors = true; 
      IController errorsController = new ErrorController(); 
      HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
      var rc = new RequestContext(wrapper, routeData); 
      errorsController.Execute(rc); 
     } 

Моего ErrorController выглядит следующим образом:

public class ErrorController : BaseController 
    { 
     /// <summary> 
     /// Returns a default view for not having access. 
     /// </summary> 
     public ActionResult Unauthorized() 
     { 
      BaseModel viewModel = new BaseModel 
             { 
              LoginModel = new LogonModel(), 
              ProfessionsTopX = GetTopXProfessions() 
             }; 
      return View(viewModel); 
     } 

     public ActionResult General(Exception exception) 
     { 
      return View("Exception", exception); 
     } 

     public ActionResult Http404() 
     { 
      //This line works 
      //return Content("Not found", "text/plain"); 

      //This line presents a blank page 
      return View("404","_Layout"); 
     } 

     public ActionResult Http403() 
     { 
      return View("403", "_Layout"); 
     } 

    } 

И мой Razor View содержит только часть html ниже;

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

Когда я использую Return Content Я получаю простой textoutput говорят мне, я смотрю на 404-странице. Тем не менее, я хочу, чтобы страница 404 соответствовала остальной части моего дизайна, поэтому я хочу использовать свои собственные представления. Однако, как только я использую Return View, я получаю пустую страницу. Я ожидаю, что пропущу что-то очень очевидное, но я этого не вижу.

+0

Это то же самое происходит со мной, вплоть до сообщений, которые я смоделировал после моего кода. –

+0

Это то же самое происходит со мной. Вы когда-нибудь находили решение этой проблемы? –

ответ

4

У меня была такая же проблема, и, наконец, я нашел решение, которое сработало для меня. Прорыв произошел, когда я поставил точку останова на errorsController.Execute(rc); линии, и используется «шаг в», пока я не наткнулся на это исключение:

The view 'Detail' or its master was not found or no view engine supports the 
searched locations. The following locations were searched: 
~/Views/Errors/Detail.aspx 
~/Views/Errors/Detail.ascx 
~/Views/Shared/Detail.aspx 
~/Views/Shared/Detail.ascx 
~/Views/Errors/Detail.cshtml 
~/Views/Errors/Detail.vbhtml 
~/Views/Shared/Detail.cshtml 
~/Views/Shared/Detail.vbhtml 

исключение проглатывания, я предполагаю, потому что происходит внутри метода Application_Error и потому что я установил Response.TrySkipIisCustomErrors = true.

Увидев эту ошибку, я быстро понял, что моя проблема была просто одним из несоответствующих имен: мой контроллер на самом деле называется ErrorController без no 's', а не ErrorsController. Проблема для меня заключалась в том, что я установил routeData.Values["controller"] = "Errors";, что неверно. Исправлена ​​проблема с переключением на routeData.Values["controller"] = "Error";.

Обратите внимание, что вы не поймаете ошибку сразу, потому что вы непосредственно создаете экземпляр контроллера, и он не будет компилироваться, если у вас есть что-то неправильно. Но внутри контроллера вызов View() будет искать представление с использованием экземпляра RouteData, который мы построили и переданного объекту RequestContext. Поэтому, если имя контроллера написано неправильно, MVC не знает, где искать представление, и поскольку ошибки пользовательского IIS пропущены, он терпит неудачу.

Краткая история: проверьте свой контроллер и просмотрите имена. Я предполагаю, что что-то подобное произойдет, если у вас правильное имя контроллера, но имя файла представления не совпадает.

+0

Нет, не нашли решение, спасибо за ваш ответ! Кажется очень логичным. Попробуй это как можно скорее и узнай об этом! – Rob

+0

Как глупо! Я изменил имя из «Ошибки в ошибку», а затем смог отладить все. Сначала я заметил, что я все еще получаю белую страницу, но после того, как я вступил в/из всего, я увидел исключение, которое было понятным.Решили, и все работает. – Rob

0

Пожалуйста, проверьте это this. Это лучший способ реализовать обработку исключений в mvc.

Я реализовал ту же обработку исключений, но мне приходится сталкиваться с какой-то проблемой, но все же вы можете ссылаться на this.

+0

Пробовал это прошлой ночью, но, к сожалению, не решил проблему (пока) Другие предложения приветствуются! – Rob

Смежные вопросы