2010-04-04 24 views
5

Sto costruendo il mio primo sito Web ASP.NET MVC e sto cercando di capire come implementare una pagina 404.404 pagine in ASP.NET MVC

Devo creare un controller chiamato "404Controller?" In tal caso, come faccio quindi a registrare questo controller con IIS in modo che reindirizzi 404 a quella pagina? Inoltre, in una situazione in cui qualcosa non viene trovato (nel database, ad esempio) da qualche altro codice controller, come faccio a reindirizzare la richiesta alla mia pagina 404?

risposta

7

L'opzione preferita per me è quello di restituire una vista chiamata 404.

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

Questo vi permetterà la possibilità di avere un generico 404 vista nella cartella condivisa, e uno specifico 404 vista il controller dell'articolo.

Inoltre, un grande vantaggio è che non vi è alcun reindirizzamento qui.

+0

Semplice e personalizzabile, mi piace. –

+0

non dimenticare gli eventi non gestiti come gli URL non validi. prova questa soluzione: http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 –

+19

Ma questo restituisce 200 codice di stato, non 404. –

14

Non c'è un'unica risposta per ciò che stai cercando di fare, il più semplice e quello che mi piace è usare la classe HttpException, ad es.

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 è possibile configurare le pagine CustomError, ad es.

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

Il modo in cui IIS gestisce gli errori mi fa ammalare. Non reindirizzare me solo perché ho digitato l'URL in modo errato. –

+4

@David Murdoch: con 'redirectMode =" ResponseRewrite "' non c'è reindirizzamento. –

+0

bene, mi sento molto meglio ora. :-) –

0
  1. Sei corretta, creare un percorso NotFoundController e mappa per esso, dire /404 e poi mettere l'URL nel file web.config (vedi @ R0MANARMY) risposta.

  2. Si può solo throw new HttpException(404, "Not Found") o se non si vuole buttare eccezioni (che è costosa) si può semplicemente impostare il codice di stato per 404 tramite Response.StatusCode proprietà e poi restituire un View("My404Template") dai vostri metodi d'azione.

+0

@chakrit: asp.net mvc non ti darà un 404 in ogni caso senza un NotFoundController? O intendi nel caso in cui desideri reindirizzare a qualcosa di diverso da una pagina html 404 statica? – R0MANARMY

4

MVC 3 include una classe HttpNotFoundResult e Controller ha anche un metodo statico HttpNotFound.

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

Nel caso in cui aiuta qualcuno lungo la strada ...

Simile alla risposta di Fitzchak Ho una visualizzazione personalizzata 404 nella mia cartella condivisa. Per restituire il codice di stato corretto ho semplicemente aggiunto questo alla parte superiore di questa tesi

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

funzionava benissimo sul mio localhost, ma sul mio server di produzione ho dovuto aggiungere questa linea alla configurazione web perché IIS stava raggiungendo lo stato 404 e mettendo su la propria pagina 404.

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