2011-04-12 2 views
30

J'ai essayé les 2 choses suivantes d'avoir une page renvoie une erreur 404:retour 404 Erreur ASP.NET MVC 3

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

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

mais les deux rendent juste une page blanche. Comment puis-je retourner manuellement une erreur 404 à partir de ASP.NET MVC 3?

Répondre

62

Si vous inspectez la réponse à l'aide de fiddler, je crois 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 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 pourrez ensuite gérer comme vous le feriez avec n'importe quelle URL. . Voici un aperçu ci-dessous:

D'abord, lancez le 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"); 

Ensuite, ajoutez un gestionnaire d'erreur personnalisé dans votre fichier web.config afin que vous puissiez déterminer ce point de 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 d'itinéraire dans votre Global.asax qui va gérer l'url « 404 », qui transmet la demande à l'action d'un contrôleur qui va afficher la vue de votre page 404 .

Global.asax

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

CommonsController

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

Tout ce qui reste est d'ajouter une vue de l'action ci-dessus.

Une mise en garde avec la méthode ci-dessus: selon le livre « ASP.NET Pro 4 en C# 2010 » (Apress) l'utilisation de customErrors est obsolète si vous utilisez IIS 7. Au lieu de cela, vous devez utiliser la section httpErrors. Voici une citation du livre:

But although this setting still works with Visual Studio’s built-in test web server, it’s effectively been replaced by the <httpErrors> section in IIS 7.x.

17

J'utilise avec succès ceci:

return new HttpNotFoundResult(); 
15

throw new HttpException(404, "NotFound"); avec un custom error handler fonctionne très bien pour moi.

2

Vous pouvez personnaliser 404 résultat avec

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

est-ce pas sujet à la crainte de bug « 404 trop court » dans IE? –

6

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 ne pas trouver du contenu.

Lorsque vous faites des appels classiques au contrôleur des actions et des vues de retour, 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);