30 votes

Renvoi de l'erreur 404 ASP.NET MVC 3

J'ai essayé les 2 choses suivantes pour qu'une page renvoie une erreur 404 :

public ActionResult Index()
{
    return new HttpStatusCodeResult(404);
}

public ActionResult NotFound()
{
    return HttpNotFound();
}

mais les deux ne font que rendre une page blanche. Comment puis-je renvoyer manuellement une erreur 404 à partir d'ASP.NET MVC 3 ?

63voto

xTRUMANx Points 807

Si vous inspectez la réponse en utilisant fiddler, je pense que vous constaterez que la page blanche renvoie en fait un code d'état 404. Le problème est qu'aucune vue n'est rendue et donc la page blanche.

Vous pouvez afficher une vue réelle à la place en ajoutant un élément customErrors à votre web.config qui redirigera l'utilisateur vers une url spécifique lorsqu'un certain code d'état se produit, que vous pourrez ensuite gérer comme vous le feriez avec n'importe quelle url. Voici un exemple ci-dessous :

Lancez d'abord le HttpException le cas échéant. Lorsque vous instanciez l'exception, assurez-vous d'utiliser l'une des surcharges qui prend un code d'état http comme paramètre, comme ci-dessous.

throw new HttpException(404, "NotFound");

Ajoutez ensuite un gestionnaire d'erreur personnalisé dans votre fichier web.config afin de pouvoir déterminer quelle vue doit être rendue lorsque l'exception ci-dessus se produit. Voici un exemple ci-dessous :

<configuration>
    <system.web>
        <customErrors mode="On">
          <error statusCode="404" redirect="~/404"/>
        </customErrors>
    </system.web>
</configuration>

Maintenant, ajoutez une entrée de route dans votre Global.asax qui traitera l'url "404" et transmettra la requête à l'action d'un contrôleur qui affichera la vue de votre page 404.

Global.asax

routes.MapRoute(
    "404", 
    "404", 
    new { controller = "Commons", action = "HttpStatus404" }
);

CommonsController

public ActionResult HttpStatus404()
{
    return View();
}

Il ne reste plus qu'à ajouter une vue pour l'action ci-dessus.

Une mise en garde concernant la méthode ci-dessus : selon le livre "Pro ASP.NET 4 in C# 2010" (Apress), l'utilisation de la fonction Erreurs personnalisées est obsolète si vous utilisez IIS 7. Vous devez plutôt utiliser la fonction httpErrors section. Voici une citation du livre :

Mais bien que ce paramètre fonctionne toujours avec le test web intégré de Visual Studio de test intégré à Visual Studio, il a été remplacé par l'option <httpErrors> dans IIS 7.x.

17voto

MartinHN Points 8587

Je l'utilise avec succès :

return new HttpNotFoundResult();

15voto

Darin Dimitrov Points 528142

throw new HttpException(404, "NotFound"); ainsi qu'un Gestionnaire d'erreur personnalisé fonctionne bien pour moi.

6voto

mare Points 5236

Vous devez utiliser

// returns 404 Not Found as EmptyResult() which is suitable for ajax calls
return new HttpNotFoundResult();

lorsque vous faites des appels AJAX à vos contrôleurs et que vous ne trouvez pas de contenu.

Lorsque vous effectuez des appels classiques aux actions du contrôleur et que vous retournez des vues, vous devez utiliser :

// throwing new exception returns 404 and redirects to the view defined in web.config <customErrors> section
throw new HttpException(404, ExceptionMessages.Error_404_ContentNotFound);

2voto

rdelcoig Points 17

Vous pouvez personnaliser le résultat 404 avec

return new HttpStatusCodeResult(404, "My message");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X