2011-11-04 3 views
4

Je cherche des itinéraires de configuration qui sont conformes à ces modèles:Comment configurer le routage complexe dans asp.net MVC

/users 
Mapped to action GetAllUsers() 

/users/12345 
Mapped to action GetUser(int id) 

/users/1235/favorites 
mapped to action GetUserFavorites(int id) 

Le contrôleur doit toujours être le UsersController. Je pensais que cela fonctionnerait, mais ce n'est pas le cas.

routes.MapRoute("1", 
       "{controller}/{action}/{id}", 
       new { id = UrlParameter.Optional, action = "index" }); 

routes.MapRoute("2", 
       "{controller}/{id}/{action}"); 

J'ai du mal à envelopper ma tête autour d'elle. Toute aide serait très appréciée.

+2

[Utiliser le débogueur de route!] (Http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx) – bzlm

+0

+1 pour @bzlm - Je n'étais pas au courant de cet outil - merci – iandotkelly

Répondre

10

Pour atteindre votre objectif, vous avez besoin de trois voies distinctes dans RegisterRoutes dans Global.asax.cs, qui devrait être ajouté dans l'ordre suivant, et doit être avant que la route Default (cela suppose que id doit être un entier) :

routes.MapRoute(
    "GetUserFavorites", // Route name 
    "users/{id}/favorites", // URL with parameters 
    new { controller = "Users", action = "GetUserFavorites" }, // Parameter defaults 
    new { id = @"\d+" } // Route constraint 
); 

routes.MapRoute(
    "GetUser", // Route name 
    "users/{id}", // URL with parameters 
    new { controller = "Users", action = "GetUser" } // Parameter defaults 
    new { id = @"\d+" } // Route constraint 
); 

routes.MapRoute(
    "GetAllUsers", // Route name 
    "users", // URL with parameters 
    new { controller = "Users", action = "GetAllUsers" } // Parameter defaults 
); 
+0

donc il n'y a pas de façon générique de le définir de sorte que je n'ai pas à coder en dur l'action ou le nom du contrôleur? – Micah

+0

Compte tenu des exigences que vous avez décrites, le routage doit être très spécifique. Cependant, si vous avez un schéma de nommage d'URL cohérent, et des noms d'actions cohérents entre vos contrôleurs, il serait possible de créer des règles pour servir plusieurs contrôleurs, pas seulement votre contrôleur d'utilisateurs. – counsellorben

+0

@Micah - oui il y a, mais pas pour le mappage de l'URL à l'action que vous avez indiqué dans votre question. J'ai ajouté ceci à ma réponse car il y a plus de place. – iandotkelly

3

counsellorben obtenu à la réponse avant que je l'ai fait. Si vous voulez ces URL exactes et ces méthodes exactes, alors c'est la seule façon. Vous pouvez réduire le nombre de routes en combinant GetUser et GetAllUsers en une action avec un identifiant nullable, par ex.

routes.MapRoute(
    "GetUser", 
    "users/{id}", 
    new { controller = "Users", action = "GetUser", id = UrlParameter.Optional} 
    new { id = @"\d+" } // Route constraint 
); 

Ce qui appellerait une méthode GetUser(int? id)

Si vous souhaitez utiliser l'URL pour régler le contrôleur et l'action appelé vous automatiquement besoin de quelque chose comme

routes.MapRoute(
     "GetUser", 
     "{controller}/{action}/{id}", 
     new { id = UrlParameter.Optional} 
     new { id = @"\d+" } // Route constraint 
    ); 

Mais il faudrait que vous changer les URL que vous vouliez alors /users/getuser/1234 irait à GetUser(int id) et /users/getallusers irait à GetAllUsers(). Ce n'est pas testé - peut-être quelques légères erreurs.