MVC 3 – Routing – Partie 3

Nous avons vu dans la partie 1 de cette saga les bases du routing avec MVC 3. La partie 2 était consacrée à l’insertion des valeurs par défaut ainsi que des valeurs statiques dans nos URL’s.

On avait laissé la partie 2 avec une erreur concernant l’URL localhost, qui dans notre cas renvoyée une erreur 404. Effectivement le pattern qu’on avait définit ne rendait une action que si l’URL contenait 0, 1 ou 2 parties. Ces parties devant être précédées de Blog (ex: localhost/Blog). L’URL localhost toute seule n’est effectivement pas vérifiée par notre pattern.

1) Routes multiples

Il est tout à fait possible d’ajouter de nouvelles définition de route dans notre méthode RegisterRoutes. Voici le code que l’on obtient en ajoutant en début de méthode la Route 2 (le nom de la route est optionnel d’ailleurs)  :

   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.MapRoute("Route 2", "{controller}/{action}", new { controller = "Home", action = "Index" });
      routes.MapRoute("Route 1", "Blog/{controller}/{action}", new { controller = "Home", action = "Index" });
   }

Si on relance l’application alors l’URL localhost nous renvoie bien sur l’action Index de notre controller Home. Victoire !

Maintenant j’aimerais plutôt que ma valeur statique Blog soit directement accolée au nom de mon controller. Ainsi toute URL du type locahost/Blog[NomDuController]/[Action] sera valide. Voici le code modifié :

   public static void RegisterRoutes(RouteCollection routes)
   {
     routes.MapRoute("Route 2", "{controller}/{action}", new { controller = "Home", action = "Index" });
     routes.MapRoute("Route 1", "Blog{controller}/{action}", new { controller = "Home", action = "Index" });
   }

Très bien on relance l’application…localhost fonctionne toujours, maintenant on va essayer locahost/BlogHome/Index…Poum ! A mince j’ai tout cassé.

2) De l’ordre dans les routes

Pourquoi donc mon adresse localhost/BlogHome/Index ne fonctionne plus…c’est en réalité tout à fait logique.

Le moteur de routing MVC va parcourir les patterns que nous avons déclarés dans l’ordre d’arrivée, dans notre cas en premier celui nommé Route 2 puis si notre URL ne correspond pas à Route 2 alors il ira chercher du côté de Route 1. Si on reprend notre URL nous pouvons la décomposer en deux parties : BlogHome et Index. Le routing en MVC n’étant pas de la magie le moteur voit la chaîne BlogHome comme étant le nom de notre controller. Du coup effectivement, n’ayant aucun controller nommé BlogHome dans notre application, le serveur nous renvoie une erreur 404. Rien est perdu nous allons intervertir les deux déclarations de routes pour obtenir ceci :

 public static void RegisterRoutes(RouteCollection routes)
 {
    routes.MapRoute("Route 1", "Blog{controller}/{action}", new { controller = "Home", action = "Index" });
    routes.MapRoute("Route 2", "{controller}/{action}", new { controller = "Home", action = "Index" });
 }

Ainsi, la première route vérifiée est celle avec la spécification la plus détaillée.

Et voilà ! Maintenant localhost, localhost/BlogHome/Index, localhost/Home/Index nous renvoie bien à chaque fois vers la méthode Index du controller Home. A retenir donc qu’il faut toujours déclarer en premier les routes avec la granularité la plus fine.

3) Exemple d’application

Prenons un exemple plus concret de l’utilité de ce mécanisme. Imaginons la page d’un site qui s’accédait auparavant par MonSite.com/Produit/Photo. Des utilisateurs auront probablement bookmarkés cette URL. On décide de changer le nom de notre controller et de l’appeler désormais Catalogue, et comme on est totalement fou on renomme aussi l’action Photo qui deviendrait PhotoVideo. Sans rien toucher, un utilisateur qui accéderait à MonSite.com/Produit/Photo se verrait remettre une belle Erreur 404, ce qui n’est pas acceptable. En revanche en ajoutant au début de la méthode RegisterRoutes le code ci dessous notre souci disparaît !

routes.MapRoute("Route Ancienne 1", "Produit/Photo", new { controller = "Catalogue", action = "PhotoVideo" });

Cette déclaration ne contient aucune partie dynamique mais permet juste d’adresser le fait que l’URL MonSite.com/Produit/Photo nous serve l’action PhotoVideo du controller Catalogue.

Leave a Reply

  

  

  


Warning: Invalid argument supplied for foreach() in /homepages/31/d265786065/htdocs/lechatcode/wp-content/plugins/kebo-twitter-feed/inc/get_tweets.php on line 257