2012-07-03 9 views
5

Korzystanie z bloga opublikowanego here i tematu here na SO Stworzyłem kontroler, który powinien obsługiwać wszystkie moje strony błędów.Strony błędów niestandardowych MVC3 dają pusty wynik

W moich Global.asax.cs Mam następujący fragment kodu:

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); 
     } 

Moja ErrorController wygląda następująco:

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"); 
     } 

    } 

A moja Razor View zawiera tylko kawałek html poniżej;

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

Kiedy używam zawartość Return Dostaję zwykły textoutput mówią mi, że jestem patrząc na 404 stronie. Jednak chcę, aby strona 404 pasowała do reszty mojego projektu, więc chcę używać własnych widoków. Jednak, gdy tylko używam widoku Powrotu, otrzymuję pustą stronę. Oczekuję, że przegapię coś bardzo oczywistego, ale nie widzę tego.

+0

Dokładnie to samo dzieje się ze mną, aż do postów, po których modelowałem mój kod. –

+0

Dokładnie to samo mi się dzieje. Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? –

Odpowiedz

4

Miałem ten sam problem iw końcu znalazłem rozwiązanie, które zadziałało dla mnie. Przełom nastąpił, kiedy umieszczony punkt przerwania na linii errorsController.Execute(rc); i stosować „krok do” aż natknąłem się na ten wyjątek:

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 

Wyjątkiem był połknął, zakładam, ponieważ dzieje się wewnątrz metody Application_Error i ponieważ ustawiłem Response.TrySkipIisCustomErrors = true.

Po obejrzeniu tego błędu szybko zorientowałem się, że mój problem jest po prostu jedną z niedopasowanych nazw: Mój kontroler ma faktycznie nazwę ErrorController bez "s", a nie ErrorsController. Problem polegał na tym, że ustawiłem routeData.Values["controller"] = "Errors";, co jest błędne. Przełączenie go na routeData.Values["controller"] = "Error"; rozwiązało problem.

Zauważ, że nie zauważysz błędu od razu, ponieważ bezpośrednio utworzysz kontroler i nie skompiluje się, jeśli masz część błędnie napisaną. Jednak w kontrolerze wywołanie metody View() spowoduje wyszukanie widoku przy użyciu instancji RouteData, którą skonstruowaliśmy i przekazaliśmy do obiektu RequestContext. Jeśli więc nazwa kontrolera jest zapisana nieprawidłowo, MVC nie wie, gdzie szukać widoku, a ponieważ niestandardowe błędy IIS są pomijane, nie działa po cichu.

Krótka historia: sprawdź kontroler i wyświetl nazwe. Zakładam, że coś podobnego by się stało, gdyby nazwa kontrolera była poprawna, ale nazwa pliku widoku nie jest zgodna.

+0

Nie znalazłem rozwiązania, dziękuję za odpowiedź! Wydaje się bardzo logiczne. Wypróbuję to jak najszybciej i skontaktuję się z Tobą! – Rob

+0

Jak głupi! Zmieniłem nazwę z Errors na Error, a następnie mogłem debugować wszystko. Najpierw zauważyłem, że wciąż dostaję białą stronę, ale po wejściu/przejściu przez wszystko zobaczyłem wyjątek, przez który zrozumiałem.Rozwiązał to i wszystko działa. – Rob

0

Proszę to sprawdzić this. Jest to najlepszy sposób implementacji wyjątków w mvc.

Mam zaimplementowany ten sam wyjątek, ale mam do czynienia z pewnym problemem, ale nadal możesz polecić this.

+0

Wypróbowałem to ostatniej nocy, ale niestety nie udało się rozwiązać problemu (jeszcze) Inne sugestie są mile widziane! – Rob

Powiązane problemy