MVC 3 – Routing – Partie 6

On va voir une fonctionnalité qui peut-être utile dans certains cas, les parties d’URL optionnelles.

1) Parties optionnelles

Il est possible de spécifier dans nos routes que certaines parties d’un pattern d’URL sont optionnelles grâce à UrlParametre.Optionnal. Voici un exemple de code l’intégrant :

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

Dans nos exemple ceci n’as pas trop d’intérêt, surtout si on utilise les paramètres optionnels du .Net 4 dans notre action Index(). Mais dans le cas où l’on souhaite savoir côté serveur si le paramètre est bien un paramètre envoyé par l’utilisateur et non une valeur par défaut qu’on aurait définie soit dans les routes soit dans la signature de la méthode, cela peut-être utile.

2) On attrape tout

Après ce petit intermède sur les valeurs optionnelles je vais lancer l’application et taper dans le navigateur localhost/Home/Index/T1/T2/T3 et attendre le résultat. Cette URL ne correspondant à aucun pattern je reçois une belle erreur 404. Et pourtant j’aimerais quand même que cette URL m’affiche le résultat de ma méthode Index(). Je ne vais bien entendu pas écrire tout les cas possibles dans mes règles de routing car MVC 3 a pensé à ce cas !
Il est en effet possible d’ajouter {*NomDeMaVariable} pour traiter toutes les parties supplémentaires de mon pattern. Ainsi l’URL localhost/Home/Index/T1/T2/T3 se verra décomposée en controller = Home, action = Index et enfin NomDeMaVariable=T1/T2/T3.

Personnellement j’ai appelé ça poubelle comme dans le code suivant :

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

Et voilà le tour est joué, on lance l’application et en testant ça fonctionne désormais correctement !

Leave a Reply