2010-04-04 3 views
5

Ich baue meine erste ASP.NET MVC-Website, und ich versuche herauszufinden, wie Sie eine 404-Seite implementieren.404 Seiten in ASP.NET MVC

Sollte ich einen Controller namens "404Controller?" Wenn ja, wie registriere ich diesen Controller dann bei IIS, sodass 404s auf diese Seite umgeleitet werden? Wird in einer Situation, in der etwas (z. B. in der Datenbank) nicht von einem anderen Controller-Code gefunden wird, die Anfrage an meine 404-Seite weitergeleitet?

Antwort

7

Die bevorzugte Option für mich ist eine Ansicht 404.

if (article == null) 
    return View("404"); 

So können Ihnen die Option aufgerufen zurückzukehren, um einen generischen 404-View in den freigegebenen Ordnern zu haben, und einen spezifischen 404 im Hinblick auf der Artikel-Controller.

Darüber hinaus ist ein großes Plus, dass es hier keine Umleitung gibt.

+0

Einfach und anpassbar, ich mag es. –

+0

Vergessen Sie nicht die unbehandelten Ereignisse wie schlechte URLs. versuchen Sie diese Lösung: http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 –

+19

Aber das gibt 200 Statuscode, nicht 404 zurück. –

14

Es gibt keine einzige Antwort für das, was Sie versuchen zu tun, die einfachste und was ich mag ist die Verwendung der HttpException Klasse, z.

public ActionResult ProductDetails(int id) { 

    Product p = this.repository.GetProductById(id); 

    if (p == null) { 
     throw new HttpException(404, "Not Found"); 
    } 

    return View(p); 
} 

In web.config können Sie customError-Seiten konfigurieren, z.

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="Views/Errors/Http404.aspx" /> 
</customErrors> 
+0

Die Art, wie IIS Fehler behandelt, macht mich krank. Leite mich nicht um, nur weil ich die URL falsch eingegeben habe. –

+4

@David Murdoch: Mit 'redirectMode =" ResponseRewrite "' gibt es keine Umleitung. –

+0

nun, ich fühle mich jetzt viel besser. :-) –

0
  1. Sie richtig sind, eine NotFoundController und Karte Route dorthin erstellen, sagen /404 und dann die URL setzen in Ihrer web.config Datei (siehe @ R0MANARMY) Antwort.

  2. Sie können nur throw new HttpException(404, "Not Found") oder wenn Sie nicht wollen, Ausnahmen werfen (was teuer ist) Sie einfach den Statuscode 404 über Response.StatusCode Eigenschaft festgelegt und dann eine View("My404Template") von der Aktionsmethoden zurück.

+0

@chakrit: Wird nicht asp.net mvc Ihnen einen 404 trotzdem ohne einen NotFoundController geben? Oder meinst du, wenn du auf etwas anderes als eine statische html 404-Seite umleiten willst? – R0MANARMY

4

MVC 3 umfasst eine HttpNotFoundResult Klasse und hat eine ControllerHttpNotFound statische Methode zu.

public ActionResult Index(int id) { 
     var myThing = Loader.GetById(id); 
     if (myThing == null) { 
      return HttpNotFound("Thing Not Found"); 
     } 
     return View(myThing); 
    } 
0

eine Application_EndRequest Methode zu Ihrem MvcApplication pro Marco's Better-Than-Unicorns MVC 404 Answer hinzufügen. Geben Sie new HttpException(404, "Not Found") ein, um einen "nicht gefunden" Fehler in Ihrem Code zu verursachen.

0

Im Fall hilft es jemand auf der Straße ...

Ähnlich Fitzchak Antwort ich eine benutzerdefinierte 404 Ansicht in meinem freigegebenen Ordner haben. Um den richtigen Statuscode kehre ich diese einfach an die Spitze dieser Ansicht hinzugefügt

@{ 
    ViewBag.Title = "Page Not Found"; 
    Response.StatusCode = 404; 
} 

große arbeitete auf meinem localhost aber auf meinem Produktions-Server Ich hatte diese Linie auf die Web-Config hinzuzufügen, da IIS die 404-Status zu kontrollieren wurde und erstelle seine eigene 404-Seite.

<system.webServer> 
    ... 
    <httpErrors errorMode="Detailed" /> 
</system.webServer>