2013-09-01 3 views
1

Comment puis-je configurer un routage {controller}/{id} dans ASP.NET MVC 5. Ce que je voudrais réaliser: s'il n'y a pas {action} défini, appelez Index() avec id.Ajouter un routage en cas de "action" manquant dans url ({controller}/{id})

J'ai essayé thism mais ne fonctionne pas:

// Keep default routing 
routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

// Add own routing in case of missing "action" 
routes.MapRoute(
    name: "Controller/Id", 
    url: "{controller}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 
+1

Je ne pense pas que vous pouvez surcharger ces routes dans cet ordre, étant donné que ID est facultative dans la première puis la résolution des routes est ambiguë et par défaut à celui ajouté en premier . par exemple. il prendra le nom que vous voulez entrer en tant que nom de l'action de la première route. Si vous voulez faire cela, vous devez d'abord mettre la deuxième route. Dans ce cas, cependant, pour utiliser le routage par défaut, vous devrez spécifier les trois paramètres. – ameer

+3

Si vous avez ajouté des contraintes et que vous avez inversé l'ordre des règles, cela pourrait fonctionner comme prévu –

+0

Merci à vous deux. J'ai essayé ce que Simon a suggéré et cela a fonctionné. –

Répondre

0

Après avoir lu le commentaire de Ameer il devient clair que le routage est pas « intelligent » que j'espérais, donc si le modèle d'URL est correspondant à une route, mais aucun contrôleur/méthode trouvé, il ne passera pas à la prochaine commande de routage, mais déclenchera une exception.

J'ai donc essayé ce que Simon a suggéré, ajouté une contrainte à mon routage personnalisé, et inversé l'ordre, et cela fonctionne maintenant. Cependant, si je voudrais avoir d'autres mappages similaires aux pièces jointes, je devrais les ajouter un par un.

Code de travail:

routes.MapRoute(
    name: "Attachments", 
    url: "attachments/{id}", 
    defaults: new { controller = "Attachments", action = "Index", id = UrlParameter.Optional } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
);