Routes ASP.NET MVC: Comment omettre «index» dans une URL

J’ai un contrôleur appelé “StuffController” avec une action d’index sans paramètre. Je souhaite que cette action soit appelée à partir d’une URL de la forme mysite.com/stuff

Mon contrôleur est défini comme

 public class StuffController : BaseController { public ActionResult Index() { // Return list of Stuff } } 

J’ai ajouté un itinéraire personnalisé pour que les itinéraires soient définis comme suit:

 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // Custom route to show index routes.MapRoute( name: "StuffList", url: "Stuff", defaults: new { controller = "Stuff", action = "Index" } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } 

Mais lorsque j’essaie de naviguer sur mysite.com/stuff un mysite.com/stuff d’erreur mysite.com/stuff .

Erreur HTTP 403.14 – Interdit

Le serveur Web est configuré pour ne pas répertorier le contenu de ce répertoire.

L’URL mysite.com/stuff/index fonctionne bien. Qu’est ce que je fais mal?

Erreur HTTP 403.14 – Interdit Le serveur Web est configuré pour ne pas répertorier le contenu de ce répertoire.

L’erreur indique que votre projet contient un répertoire virtuel (probablement physique) appelé /Stuff . Par défaut, IIS /index.html abord à ce répertoire et recherchera une page par défaut (par exemple /index.html ). Si aucune page par défaut n’existe, le contenu de ce répertoire sera répertorié (ce qui nécessite un paramètre de configuration).

Tout cela se produit avant qu’IIS ne passe l’appel au routage .NET. Par conséquent, le fait de disposer d’un répertoire portant le nom /Stuff empêche votre application de fonctionner correctement. Vous devez supprimer le répertoire nommé /Stuff ou utiliser un nom différent pour votre itinéraire.

Et comme d’autres l’ont mentionné, la route par défaut couvre ce scénario, de sorte qu’il n’est pas nécessaire de créer une route personnalisée dans ce cas.

 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // Passing the URL `/Stuff` will match this route and cause it // to look for a controller named `StuffController` with action named `Index`. routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } 

Il semble que votre scénario soit bien traité par la route par défaut, il n’est donc pas nécessaire d’en faire un Stuff personnalisé.

En ce qui concerne la raison pour laquelle l’erreur est générée, le fait que l’action soit répertoriée dans les valeurs par défaut ne signifie pas qu’elle devient réellement une partie d’un itinéraire. Cela devrait être mentionné dans la route, sinon, il apparaît qu’il n’y a aucune action. Donc, ce que je pense qui se passe ici, c’est que la première route est mise en correspondance, mais elle ne peut pas être traitée car aucune action n’est spécifiée. MVC transmet donc la demande à IIS, qui lève l’erreur nommée.

La solution serait simple:

 // Custom route to show index routes.MapRoute( name: "StuffList", url: "Stuff/{action}", defaults: new { controller = "Stuff", action = "Index" } ); 

Mais encore une fois, vous ne devriez pas avoir besoin de ça du tout.