web-dev-qa-db-fra.com

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 rendent simplement une page vierge. Comment puis-je retourner manuellement une erreur 404 à partir d'ASP.NET MVC 3?

30
ryanzec

Si vous inspectez la réponse à l'aide de fiddler, je pense que vous constaterez que la page vierge renvoie en fait un code d'état 404. Le problème est qu'aucune vue n'est affichée et donc la page vierge.

Vous pouvez obtenir une vue réelle à afficher à 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 pouvez ensuite gérer comme vous le feriez avec n'importe quelle URL. Voici une présentation ci-dessous:

Lancez d'abord HttpException le cas échéant. Lors de l'instanciation de l'exception, veillez à 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'erreurs 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>

Ajoutez maintenant une entrée d'itinéraire dans votre Global.asax qui gérera l'url "404" qui transmettra la demande à l'action d'un contrôleur qui affichera la page Afficher pour votre 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 avec la méthode ci-dessus: selon le livre "Pro ASP.NET 4 en C # 2010" (Apress), l'utilisation de customErrors est obsolète si vous utilisez IIS 7. Au lieu de cela, vous devriez utiliser la section httpErrors . Voici une citation du livre:

Mais bien que ce paramètre fonctionne toujours avec le serveur Web de test intégré de Visual Studio, il a été effectivement remplacé par la section <httpErrors> Dans IIS 7.x.

63
xTRUMANx

J'utilise avec succès ceci:

return new HttpNotFoundResult();
17
MartinHN

throw new HttpException(404, "NotFound"); avec un gestionnaire d'erreur personnalisé fonctionne très bien pour moi.

15
Darin Dimitrov

Tu devrais utiliser

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

lorsque vous effectuez AJAX appels à vos contrôleurs et ne trouvez aucun contenu.

Lorsque vous effectuez des appels classiques aux actions du contrôleur et renvoyez 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);
6
mare

Vous pouvez personnaliser le résultat 404 avec

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