2010-04-04 4 views
5

Je construis mon premier site Web ASP.NET MVC, et j'essaie de comprendre comment implémenter une page 404.404 Pages dans ASP.NET MVC

Dois-je créer un contrôleur appelé "404Controller?" Si oui, comment puis-je enregistrer ce contrôleur avec IIS afin qu'il redirige 404 vers cette page? En outre, dans une situation où quelque chose n'est pas trouvé (dans la base de données, par exemple) par un autre code de contrôleur, comment rediriger la requête vers ma page 404?

Répondre

7

L'option préférée pour moi est de retourner une vue appelée 404.

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

Cela vous permettra la possibilité d'avoir une vue générique 404 dans le dossier partagé, et une vue spécifique à 404 le contrôleur d'article.

De plus, un gros avantage est qu'il n'y a pas de redirection ici.

+0

Simple et personnalisable, je l'aime bien. –

+0

ne pas oublier les événements non gérés comme les mauvaises URL. essayez cette solution: http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 –

+19

Mais cela renvoie 200 code d'état, pas 404. –

14

Il n'y a pas de réponse unique pour ce que vous essayez de faire, le plus simple et ce que j'aime utiliser la classe HttpException, par exemple.

public ActionResult ProductDetails(int id) { 

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

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

    return View(p); 
} 

Sur web.config, vous pouvez configurer des pages customError, par ex.

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

La manière dont IIS gère les erreurs me rend malade. Ne me redirigez pas juste parce que j'ai mal tapé l'URL. –

+4

@David Murdoch: Avec 'redirectMode =" ResponseRewrite "' il n'y a pas de redirection. –

+0

Eh bien, je me sens beaucoup mieux maintenant. :-) –

0
  1. Vous avez raison, créez un itinéraire NotFoundController et carte pour, dites-/404 puis mettre l'URL dans votre fichier web.config (voir @ R0MANARMY) réponse.

  2. Vous pouvez juste throw new HttpException(404, "Not Found") ou si vous ne voulez pas lancer des exceptions (ce qui est coûteux), vous pouvez simplement le code d'état à 404 par Response.StatusCode propriété, puis retourner un View("My404Template") de vos méthodes d'action.

+0

@chakrit: asp.net mvc ne vous donnera-t-il pas un 404 de toute façon sans un NotFoundController? Ou voulez-vous dire au cas où vous voulez rediriger vers quelque chose d'autre qu'une page html 404 statique? – R0MANARMY

4

MVC 3 inclut une classe HttpNotFoundResult et Controller a également une méthode statique HttpNotFound.

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

Ajouter une méthode Application_EndRequest à votre MvcApplication par Marco's Better-Than-Unicorns MVC 404 Answer. Pour provoquer une erreur «introuvable» à partir de votre code, lancez new HttpException(404, "Not Found").

0

Dans le cas où il aide quelqu'un sur la route ...

similaires à la réponse de Fitzchak J'ai vue 404 dans mon dossier partagé. Pour retourner le code d'état correct j'ai simplement ajouté à la partie supérieure de ce point de vue

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

fonctionnait très bien sur mon localhost mais sur mon serveur de production que je devais ajouter cette ligne à la configuration Web, car IIS attrapait le statut 404 et mettre en place sa propre page 404.

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