Comment créer un itinéraire permettant de gérer toutes les requêtes 'page 404 non trouvées' pour ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/310580

Question

Est-il possible de créer un itinéraire final qui capture tout .. et renvoie l'utilisateur à une vue 404 dans ASP.NET MVC?

REMARQUE: je ne veux pas configurer cela dans mes paramètres IIS.

Était-ce utile?

La solution

J'ai trouvé la réponse moi-même.

Richard Dingwall publie un excellent article sur différentes stratégies. J'aime particulièrement la solution FilterAttribute. Je ne suis pas fan de jeter des exceptions autour de willy nilly, je vais donc voir si je peux améliorer ça:)

Pour le fichier global.asax, ajoutez ce code comme dernier itinéraire à enregistrer:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );

Autres conseils

Cette question est venue en premier, mais la réponse la plus facile est venue dans une question ultérieure:

Routage pour la page d'erreur ASP.NET MVC 404 personnalisée

  

La gestion des erreurs a fonctionné en créant un ErrorController qui   renvoie les vues dans cet article. Je devais également ajouter le champ "Catch All".   à la route dans global.asax.

     

Je ne vois pas comment cela aboutirait à l'une de ces pages d'erreur si ce n'est pas le cas.   dans le Web.config ..? Mon Web.config devait spécifier:

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

et puis j'ai aussi ajouté:

error statusCode="404" redirect="~/Error/NotFound"
     

J'espère que cela vous aidera.

J'aime cette façon maintenant parce que c'est si simple:

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>

Vous pouvez également gérer l'erreur NOT FOUND dans Global.asax.cs comme ci-dessous

protected void Application_Error(object sender, EventArgs e)
{
    Exception lastErrorInfo = Server.GetLastError();
    Exception errorInfo = null;

    bool isNotFound = false;
    if (lastErrorInfo != null)
    {
        errorInfo = lastErrorInfo.GetBaseException();
        var error = errorInfo as HttpException;
        if (error != null)
            isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
    }
    if (isNotFound)
    {
        Server.ClearError();
        Response.Redirect("~/Error/NotFound");// Do what you need to render in view
    }
}

Ajoutez ces lignes sous le fichier web.config de la racine de votre projet.

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>

Cela peut être un problème lorsque vous utilisez

throw new HttpException(404);

Si vous voulez comprendre cela, je ne connais pas d'autre moyen de modifier votre configuration Web.

Une alternative à la création d'une route fourre-tout consiste à ajouter une méthode Application_EndRequest à votre MvcApplication par Réponse de Marco, meilleure que les licornes MVC 404 .

Dans RouterConfig.cs , ajoutez le code suivant:

  routes.MapRoute(
           name: "Error",
           url: "{id}",
           defaults: new
           {
               controller = "Error",
               action = "PageNotFound"

           });

Si la route ne peut pas être résolue, le framework MVC traversera une erreur 404 .. La meilleure approche consiste à utiliser des filtres d’exception ... Créez un filtre d’exception personnalisé et procédez comme suit.

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top