Routage personnalisé ASP.NET page D'erreur MVC 404

j'essaie de faire une page D'erreur HTTP 404 personnalisée quand quelqu'un tape une URL qui n'invoque pas une action ou un controller valide dans ASP.NET MVC, au lieu d'afficher le générique "ressource non trouvée" ASP.NET erreur.

je ne veux pas utiliser le web.config pour gérer ça.

est-ce qu'il y a une sorte de magie de routage que je peux faire pour attraper des URL invalides?

mise à jour: j'ai essayé la réponse donnée, cependant j'obtiens toujours le message laid "ressource non trouvée".

une autre mise à jour: Ok, apparemment quelque chose a changé dans RC1. J'ai même essayé de piéger spécifiquement 404 sur un HttpException et ça me donne toujours la page "ressource non trouvée".

j'ai même utilisé la fonctionnalité de la ressource de MvcContrib et rien - même problème. Des idées?

106
demandé sur alex 2009-02-16 19:37:04

9 réponses

il suffit d'ajouter catch all route à la fin de la table des routes et d'afficher n'importe quelle page que vous voulez avec elle.

Voir: Comment puis-je faire un fourre-tout de l'itinéraire pour gérer "404 page not found' des requêtes pour ASP.NET MVC?

9
répondu Alex Reitbort 2017-05-23 12:26:09

j'ai essayé d'activer les erreurs personnalisées sur le serveur de production pendant 3 heures, il semble que j'ai trouvé la solution finale ASP.NET MVC sans aucune route.

pour activer les erreurs personnalisées dans ASP.NET application MVC dont nous avons besoin (IIS 7+):

  1. configurer les pages personnalisées dans la configuration web sous system.web section:

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
        <error statusCode="404" redirect="~/error/Error404" />
        <error statusCode="500" redirect="~/error" />
    </customErrors>
    

    RemoteOnly signifie que sur le réseau local vous verrez de vraies erreurs (très utile pendant le développement). Nous pouvons également réécrire la page d'erreur pour n'importe quel code d'erreur.

  2. paramètre de réponse magique et code d'état de réponse (dans le module de gestion des erreurs ou dans l'attribut de poignée d'erreur)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. définir un autre paramètre magique dans la configuration web sous system.webServer section:

    <httpErrors errorMode="Detailed" />
    

C'est la dernière chose que j'ai trouvée et après cela je peux voir des erreurs personnalisées sur le serveur de production.

100
répondu Andrew Orsich 2011-12-09 20:32:22

j'ai réussi à gérer mes erreurs en créant un ErrorController qui renvoie les vues de cet article. J'ai aussi dû ajouter le "Catch All" à la route dans global.asax.

je ne vois pas comment il va arriver à l'une de ces pages d'erreur si elle n'est pas dans le Web.config..? Mon Web.config devait préciser:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

et puis j'ai aussi ajouté:

error statusCode="404" redirect="~/Error/NotFound"
41
répondu Jack Smit 2018-01-07 00:32:41

Source

NotFoundMVC - fournit une page 404 conviviale chaque fois qu'un contrôleur, une action ou une route n'est pas trouvé dans votre ASP.NET application MVC3. Une vue appelée NotFound est rendue à la place de la valeur par défaut ASP.NET page d'erreur.

vous pouvez ajouter ce plugin via nuget en utilisant: Install-Package NotFoundMvc

NotFoundMvc s'installe automatiquement pendant le web démarrage de l'application. Il gère toutes les différentes façons dont une HttpException 404 est habituellement lancée par ASP.NET MVC. Cela comprend la perte d'un contrôleur, d'une action et d'une route.

Guide D'Installation étape par étape:

1-Faites un clic droit sur votre projet et sélectionnez Gérer les paquets Nuget...

2-Rechercher NotFoundMvc et l'installer. enter image description here

3-Une fois le l'installation sera terminée, deux fichiers seront ajoutés à votre projet. Comme indiqué dans les captures d'écran ci-dessous.

enter image description here

4-ouvrir le NotFound nouvellement ajouté.cshtml présents à Vue, Partagé, et de le modifier à votre gré. Maintenant, exécutez l'application et tapez une url incorrecte, et vous serez accueilli avec une page 404 conviviale.

enter image description here

Non plus, les utilisateurs pourront-ils obtenir message d'erreurs comme Server Error in '/' Application. The resource cannot be found.

Espérons que cela aide :)

P. S : Bravo à la Andrew Davey pour faire un tel plugin génial.

26
répondu Yasser 2012-11-13 10:22:46

essayez ceci sur le web.config pour remplacer les pages d'erreur IIS. C'est la meilleure solution je pense, et il envoie le code d'état correct aussi.

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="Error404.html" responseMode="File" />
    <error statusCode="500" path="Error.html" responseMode="File" />
  </httpErrors>
</system.webServer>

plus d'informations de Tipila-Use Custom Error Pages ASP.NET MVC

18
répondu Amila 2017-04-14 12:40:35

cette solution n'a pas besoin de web.changements de fichier de configuration ou routes fourre-tout.

d'abord, créer un contrôleur comme celui-ci;

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Regular Error";
        return View();
    }

    public ActionResult NotFound404()
    {
        ViewBag.Title = "Error 404 - File not Found";
        return View("Index");
    }
}

crée alors la vue sous" vues/erreur/Index.cshtml";

 @{
      Layout = "~/Views/Shared/_Layout.cshtml";
  }                     
  <p>We're sorry, page you're looking for is, sadly, not here.</p>

puis ajouter ce qui suit dans le fichier ASAX Global comme suit:

protected void Application_Error(object sender, EventArgs e)
{
        // Do whatever you want to do with the error

        //Show the custom error page...
        Server.ClearError(); 
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";

        if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
        {
            routeData.Values["action"] = "Index";
        }
        else
        {
            // Handle 404 error and response code
            Response.StatusCode = 404;
            routeData.Values["action"] = "NotFound404";
        } 
        Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
        IController errorsController = new ErrorController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
        errorsController.Execute(rc);

        Response.End();
}

si vous obtenez toujours la page d'erreur custom IIS après avoir fait cela, assurez-vous que les sections suivantes sont commenté (ou vide) dans le fichier de configuration web:

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>
15
répondu Sujeewa 2017-12-18 20:26:32

si vous travaillez dans MVC 4, Vous pouvez regarder cette solution , cela a fonctionné pour moi.

ajouter la méthode Application_Error suivante à mon Global.asax :

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action", "Index");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    IController controller = new ErrorController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();

le contrôleur lui-même est vraiment simple:

public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        return View();
    }
}

vérifiez le code source complet de Mvc4CustomErrorPage at GitHub .

5
répondu Duc Hoang 2015-05-25 09:30:54

j'ai eu le même problème, la chose que vous devez faire est, au lieu d'ajouter l'attribut customErrors dans le web.fichier de configuration dans votre dossier de Vues, vous devez l'ajouter dans le web.fichier de configuration dans le dossier racine de vos projets

0
répondu SmokeIT 2009-12-27 15:35:27

Voici true answer qui permet de personnaliser entièrement la page d'erreur en un seul endroit. Pas besoin de modifier web.config ou créez des code.

fonctionne aussi dans MVC 5.

ajouter ce code au contrôleur:

        if (bad) {
            Response.Clear();
            Response.TrySkipIisCustomErrors = true;
            Response.Write(product + I(" Toodet pole"));
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            //Response.ContentType = "text/html; charset=utf-8";
            Response.End();
            return null;
        }

basé sur http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages

0
répondu Andrus 2016-07-22 16:13:23