MVC 3 – Routing – Partie 4

Très bien on a pu voir l’importance de l’ordre et la création de route multiples dans l’article précédent, mais maintenant j’aimerais rajouter des paramètres à mes URL’s. C’est bien beau de pouvoir définir le controller et l’action mais si on pouvait aller un peu plus loin…

1) Ajout de nouvelles parties dynamiques

Et oui..une solution existe et est très simple à implémenter. On peur rajouter une infinité de parties variables dans nos URL’s en MVC 3. Par exemple je voudrais que mon action Index du controller Home reçoive en paramètre une variable pseudonyme sous la forme de localhost/Home/Index-MonPseudo.

Rien de plus simple…regardez le code suivant (j’ai enlevé volontairement les URL’s avec le mot statique Blog issue de l’article précédent comme ça c’est plus clair).

 public static void RegisterRoutes(RouteCollection routes)
 {
   routes.MapRoute("Route avec pseudo", "{controller}/{action}-{pseudonyme}", new { controller = "Home", action = "Index", pseudonyme="Inconnu" });
   routes.MapRoute("Route 2", "{controller}/{action}", new { controller = "Home", action = "Index" });
 }

Et voilà le tour est joué, mes URL’s avec Index-MonPseudo seront valides. Attention il faut bien laisser la deuxième ligne de la méthode sinon les URL’s de type Home/Index ne seront plus servies.

On peut donner le nom que l’on souhaite aux nouvelles variables de parties à la condition que ce ne soit pas l’un de ces trois noms qui sont eux réservés : controller, action, area.

Bon, très bien de mettre un pseudo en fin d’URL mais j’en fait quoi ?

2) Utilisation des nouvelles parties

Maintenant que l’on passe également un pseudonyme dans l’URL on va le traiter et notre action Index va nous renvoyer un classique Bonjour [MonPseudo] ! Tout d’abord on va supprimer tout ce que contient la méthode Index de notre classe HomeController. Ensuite on rajoute ceci :

public ActionResult Index()
{
  ViewBag.Pseudonyme = RouteData.Values["pseudonyme"];

  return View();
}

La ligne intéressante est surlignée. Pour récupérer les variables passées par l’URL on utilise l’objet RouteData, sa propriété Values qui est en gros un dictionnaire nous permet d’obtenir la valeur présente à la clé pseudonyme. Pour passer tout ça à la vue on va utiliser le ViewBag, ce système permet de déclarer dans cet objet n’importe quelle propriété, juste en mettant ViewBag.NomDeMaPropriete. Si on lance l’application et qu’on tape localhost/Home/Index-Test on n’obtient pas grand chose…il faut donc aussi modifier la vue.

@{
    ViewBag.Title = "Home Page";
}

   Bonjour @ViewBag.Pseudonyme

Aussi simple que ça ! on relance l’application et en tapant localhost/Home/Index-Test on se retrouve avec :

Résultat dans le navigateur

Et si par fouinerie on ne passait que l’URL suivante : locahost/Home/Index. Personnellement je m’attendrais à ce que l’application renvoie une erreur étant donné que dans le code behind de notre controller on affecte une valeur qui n’existe pas…et bien non ça fonctionne quand même. Bon c’est pas top on va modifier les routes pour qu’il affiche par défaut Bonjour Inconnu. Ceci grâce au valeur par défaut que l’on définies dans le troisième paramètre de la méthode MapRoute.

  public static void RegisterRoutes(RouteCollection routes)
  {
     routes.MapRoute("Route avec pseudo", "{controller}/{action}-{pseudonyme}", new { controller = "Home", action = "Index", pseudonyme = "Inconnu" });
     routes.MapRoute("Route 2", "{controller}/{action}", new { controller = "Home", action = "Index", pseudonyme="Inconnu" });
  }

C’est fait désormais l’URL localhost, localhost/Home/Index renverra Bonjour Inconnu.

Dans le prochain post nous verrons comment passer ces parties d’URL en tant que paramètres de la méthode Index() du controller.

Leave a Reply