ASP.NET MVC – Catch All Route Et Default Route

En essayant de faire en sorte que mon application produise des erreurs 404 correctement, j’ai implémenté un itinéraire de type catch all à la fin de ma table de routage, comme indiqué ci-dessous:

routes.MapRoute( "NotFound", _ "{*url}", _ New With {.controller = "Error", .action = "PageNotFound"} _ ) 

Cependant, pour que cela fonctionne, je devais supprimer la route par défaut:

 {controller}/action/{id} 

Mais maintenant que la valeur par défaut a été supprimée, la plupart de mes liens d’action ne fonctionnent plus, et la seule façon de les retrouver pour qu’ils fonctionnent à nouveau consiste à append des itinéraires individuels pour chaque contrôleur / action.

Y a-t-il une manière plus simple de le faire, plutôt que d’append un itinéraire pour chaque contrôleur / action?

Est-il possible de créer une route par défaut qui permette toujours à l’ensemble de la route de fonctionner si l’utilisateur tente de naviguer vers une route inconnue?

Utiliser des contraintes de route

Dans votre cas, vous devez définir votre route {controller}/{action}/{id} par défaut et y placer une contrainte. Probablement lié aux noms de contrôleurs ou peut-être même à des actions. Ensuite, mettez tous les un après et cela devrait fonctionner correctement.

Ainsi, lorsque quelqu’un demande une ressource qui échoue à une contrainte, la route passe-partout correspond à la demande.

Alors. Définissez d’abord votre route par défaut avec des contraintes de route, puis la route de tous les trajets:

 routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { controller = "Home|Settings|General|..." } // this is basically a regular expression ); routes.MapRoute( "NotFound", "{*url}", new { controller = "Error", action = "PageNotFound" } ); 
 //this catches all requests routes.MapRoute( "Error", "{*.}", new { controller = "PublicDisplay", action = "Error404" } ); 

append cette route à la fin de la table des routes

Ah, le problème est que votre itinéraire par défaut attrape toutes les URL à 3 segments . Le problème ici est que le routage s’exécute bien avant que nous déterminions qui va traiter la demande. Ainsi, toute URL à trois segments correspondra à la route par défaut, même si cela se termine plus tard par l’absence de contrôleur.

Une chose que vous pouvez faire est de remplacer la méthode HandleMissingAction par votre contrôleur. Vous devriez également utiliser la balise pour attraper les 404 problèmes.

Eh bien, ce que j’ai trouvé, c’est qu’il n’y a pas de bonne façon de faire cela. J’ai défini la propriété redirectMode des customErrors sur ResponseRewrite .

    

Cela me donne le comportement recherché, mais n’affiche pas la page formatée.

Pour moi, cela est mal fait, en ce qui concerne le référencement. Cependant, j’estime qu’il me manque une solution car SO fait exactement ce que je veux. L’URL rest sur la page en échec et lance un 404. Inspectez stackoverflow.com/fail dans Firebug.

Je recommanderais ceci comme version la plus lisible. Vous en avez besoin dans votre RouteConfig.cs, et un contrôleur appelé ErrorController.cs, contenant une action ‘PageNotFound’. Cela peut renvoyer une vue. Créez un fichier PageNotFound.cshtml, qui sera renvoyé en réponse à la 404:

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

Comment lire ceci:

 name: "PageNotFound" 

= créer un nouveau modèle de route, avec le nom arbitraire “PageNotFound”

 url:"{*url}" 

= utiliser ce modèle pour mapper tous les itinéraires non gérés

 defaults: new { controller = "Error", action = "PageNotFound" } 

= définir l’action à laquelle un chemin incorrect sera mappé (la méthode d’action ‘PageNotFound’ dans le contrôleur d’erreur). Ceci est nécessaire car un chemin incorrect entré ne sera évidemment pas mappé à une méthode d’action

Il est probablement préférable de configurer le document d’erreur 404 dans la section de la configuration, puis de restaurer l’itinéraire par défaut.

FWIW, je pense que la condition de route par défaut est également retardée.

Ma solution est en 2 étapes.

J’ai initialement résolu ce problème en ajoutant cette fonction à mon fichier Global.asax.cs:

 protected void Application_Error(Object sender, EventArgs e) 

Où j’ai essayé de convertir Server.GetLastError () en HttpException, puis j’ai coché GetHttpCode. Cette solution est détaillée ici:

ASP.NET MVC Gestion des erreurs personnalisée Application_Error Global.asax?

Ce n’est pas la source originale où j’ai le code. Cependant, cela ne détecte que 404 erreurs qui ont déjà été acheminées. Dans mon cas, cela concerne toute URL à 2 niveaux.

Par exemple, ces URL afficheraient la page 404:

http://www.site.com/blah

http://www.site.com/blah/blah

Cependant, http://www.site.com/blah/blah/blah dirait simplement que la page est introuvable. L’ajout de tous vos itinéraires APRES toutes mes autres routes a résolu ce problème:

 routes.MapRoute( "NotFound", "{*url}", new { controller = "Errors", action = "Http404" } ); 

Toutefois, l’itinéraire NotFound ne semble pas acheminer les demandes comportant des extensions de fichier. Cela fonctionne quand ils sont capturés par des itinéraires différents.

Si vous recherchez ASP.NET Core, saisissez toutes les routes et recherchez Google pour asp.net core catch all route vous amène ici:

ASP.net core MVC attraper tous les fichiers servir le fichier statique