2012-07-03 6 views
5

Mit dem Blog gepostet here und ein Thema here auf, damit ich einen Controller erstellt haben, die meine Fehler alle Seiten behandeln soll.MVC3 Benutzerdefinierte Fehlerseiten gibt leeres Ergebnis

In meinem Global.asax.cs Ich habe das folgende Stück Code bekommt:

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

Mein Errorcontroller wie folgt aussieht:

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

    } 

Und meine Rasiermesser Ansicht enthält nur das Stück HTML unten; Ich freue mich auf eine 404-Seite

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

Wenn ich den Return Inhalt verwende ich bin eine einfache Textausgabe immer mir zu sagen. Ich möchte jedoch, dass die 404-Seite dem Rest meines Designs entspricht, daher möchte ich meine eigenen Ansichten verwenden. Sobald ich jedoch Return View verwende, erhalte ich eine leere Seite. Ich erwarte etwas sehr Offensichtliches zu verpassen, aber ich sehe es nicht.

+0

Genau dasselbe geschieht mir, bis auf die Posts, nach denen ich meinen Code modelliert habe. –

+0

Genau dasselbe passiert mir. Haben Sie jemals eine Lösung für dieses Problem gefunden? –

Antwort

4

Ich habe das gleiche Problem, und fand schließlich die Lösung, die für mich gearbeitet. Der Durchbruch kam, als ich einen Haltepunkt auf der Linie errorsController.Execute(rc); platziert und verwenden ‚Schritt in‘ bis ich auf diese Ausnahme kam:

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 

Die Ausnahme geschluckt wurde, nehme ich an, weil es in der Application_Error Methode vorging und weil ich Response.TrySkipIisCustomErrors = true eingestellt hatte.

Nachdem ich diesen Fehler gesehen hatte, wurde mir schnell klar, dass mein Problem einfach einer der nicht übereinstimmenden Namen war: Mein Controller heißt eigentlich ErrorController ohne 's', nicht ErrorsController. Das Problem für mich war, dass ich routeData.Values["controller"] = "Errors"; gesetzt hatte, was falsch ist. Das Umschalten auf routeData.Values["controller"] = "Error"; hat das Problem behoben.

Beachten Sie, dass Sie den Fehler nicht sofort fangen, da Sie direkt den Controller instanziiert, und es wird nicht kompiliert, wenn Sie, dass ein Teil falsch geschrieben. Aber innerhalb des Controllers sucht View() nach der Ansicht, die die RouteData Instanz verwendet, die wir erstellten und an das Objekt RequestContext übergaben. Wenn also der Name des Controllers dort falsch geschrieben wird, weiß MVC nicht, wo nach der Ansicht gesucht werden soll, und da benutzerdefinierte IIS-Fehler übersprungen werden, schlägt es im Hintergrund fehl.

lange Geschichte kurz: Überprüfen Sie Ihre Controller und Ansichtsnamen. Ich nehme an, etwas ähnliches würde passieren, wenn Sie den Controller-Namen korrekt haben, aber der Dateiname der Ansicht nicht übereinstimmt.

+0

Nein, habe keine Lösung gefunden, danke für deine Antwort! Scheint sehr logisch. Werde das so schnell wie möglich ausprobieren und dich dann darüber informieren! – Rob

+0

Wie dumm! Ich änderte den Namen von Errors in Error und konnte dann alles debuggen. Zuerst bemerkte ich, dass ich immer noch eine weiße Seite bekam, aber nachdem ich in/durch alles getreten war, sah ich eine Ausnahme, die verständlich war.Gelöst es und alles funktioniert. – Rob

0

Bitte überprüfen Sie es this aus. Dies ist der beste Weg, die Ausnahmebehandlung in mvc zu implementieren.

Ich habe gleiche Ausnahmebehandlung implementiert, aber ich bin eine Frage, die sich aber nach wie vor können Sie this beziehen.

+0

Habe es letzte Nacht versucht, aber leider das Problem nicht gelöst (noch) Andere Vorschläge sind willkommen! – Rob

Verwandte Themen