ASP.
NET MVC : routage
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
[Link]@[Link]
H & H: Research and Training 1 / 30
Plan
1 Routage par fichiers yml
2 Routage par décorateurs
[Route]
[RoutePrefix]
3 Verbes HTTP
[HttpGet]
[HttpPost]
[AcceptVerbs]
H & H: Research and Training 2 / 30
Routage par fichiers yml
[Link] MVC
Introduction
H I ©
EL
[Link] MVC génère un fichier de routage par défaut pour
U
chaque application créée O
f E LM
ch r e
On peut modifier la route par défaut
©A
On peut aussi définir une nouvelle
H & H: Research and Training 3 / 30
Routage par fichiers yml
[Link] MVC
Contenu du RouteConfig
[Link](
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "
H I ©
Index", id = [Link]}
UEL
O
LM
);
r e f E
ch
©A
H & H: Research and Training 4 / 30
Routage par fichiers yml
[Link] MVC
Contenu du RouteConfig
[Link](
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "
H I ©
Index", id = [Link]}
UEL
O
LM
);
r e f E
Si l’URL est composée de trois segments, le premier sera le nom
ch
©A
du contrôleur, le deuxième sera l’action et le dernier sera le
paramètre (donc, cette route autorise seulement un seul
paramètre
Des valeurs par défaut ont été précisées pour chaque segment si
une valeur pour ce dernier n’a pas été renseignée (Attention à
l’ordre des segments)
H & H: Research and Training 4 / 30
Routage par fichiers yml
[Link] MVC
Créons une nouvelle route
[Link](
name: "Second",
url: "second/{msg}/{nbr}",
defaults: new { controller = "Second", action = "
Index", msg = [Link], nbr=
H I ©
[Link]});
UEL
O
LM
[Link](
name: "Default",
r e f
url: "{controller}/{action}/{id}", E
ch
©A
defaults: new { controller = "Home", action = "Index"
, id = [Link]});
H & H: Research and Training 5 / 30
Routage par fichiers yml
[Link] MVC
Créons une nouvelle route
[Link](
name: "Second",
url: "second/{msg}/{nbr}",
defaults: new { controller = "Second", action = "
Index", msg = [Link], nbr=
H I ©
[Link]});
UEL
O
LM
[Link](
name: "Default",
r e f
url: "{controller}/{action}/{id}", E
ch
©A
defaults: new { controller = "Home", action = "Index"
, id = [Link]});
Tandis que la route Default renvoie vers plusieurs contrôleurs, la route
Second dirige vers un seul contrôleur (qui est SecondControleur). Elle
prend au plus deux paramètres. Le deuxième est de type numérique.
H & H: Research and Training 5 / 30
Routage par fichiers yml
[Link] MVC
Supposons que le contenu du SecondController est le suivant :
public class SecondController : Controller
{
// GET: Second
H I ©
EL
public String Index(string msg, int nbr)
{
O U
string result = " ";
f E LM
{ ch r e
for(int i = 0; i< nbr; i++)
}
©A
result += msg + " ";
return result;
}
}
H & H: Research and Training 6 / 30
Routage par fichiers yml
[Link] MVC
Exemple
/second/wick/3 affiche wick wick wick
/second?msg=wick&nbr=3 affiche wick wick wick
H I ©
EL
OU
/second/3/wick génère une erreur
M
E L affiche wick wick wick
/second?nbr=3&msg=wick
f
chr e
© A
Attention à l’ordre des routes
Si on inverse les deux routes Default et Second, la route
/second/wick/3 déclenchera une erreur aussi.
H & H: Research and Training 7 / 30
Routage par fichiers yml
[Link] MVC
On peut définir des contraintes sur les paramètres de nos routes
nbr = @"\d+" : pour indiquer que nbr est de type numérique (\d :
entier, + : au moins un)
H I ©
si l’url est /second/wick/john, alors une erreur 404 sera affichée.
UEL
O
Le compilateur commence par chercher la route dont le contrôleur est
E LM
second et dont le deuxième paramètre est de type entier.
f
r e
h avec la route "second/{msg}/{nbr}", il
croute
Pas de correspondance
©
passe donc A
à la suivante dans RouteConfig.
Il ne trouve aucune correspondance, il retourne donc une erreur 404.
Pour utiliser les expressions régulières dans la plateforme .NET, il faut utiliser
le namespace [Link]
H & H: Research and Training 8 / 30
Routage par fichiers yml
[Link] MVC
Dans ce cas, il faut ajouter une section constraints
[Link](
H I ©
name: "Default",
UEL
url: "{controller}/{action}/{id}", O
E
defaults: new { controller = "Home", action = "
f LM
Index"},
ch r e
©A
constraints: new { id = @"\d+"}
);
H & H: Research and Training 9 / 30
Routage par fichiers yml
[Link] MVC
Autres contraintes (exprimées avec les expressions régulières)
nbr = @"\d{4}" : pour indiquer que nbr doit contenir 4
chiffres
* : 0 ou plusieurs fois
H I ©
EL
? : 0 ou 1 fois
ˆ : commence par O U
$ : se termine par f E LM
. : n’importeA
r e
chcaractère
quel
©
() : le groupe
{n,m} : minimum n fois, maximum m fois
{n} : n fois exactement
{n,} : minimum n fois
H & H: Research and Training 10 / 30
Routage par fichiers yml
[Link] MVC
Autres contraintes (exprimées avec les expressions régulières)
\d : un chiffre
\D : tout sauf un chiffre
H I ©
EL
\w : un caractère alphanumérique
M OU
\W : tout sauf un caractE èreL
r e f alphanumérique
A
\t : un caract chde tabulation
ère
©
\n : un caractère de retour à la ligne
...
H & H: Research and Training 11 / 30
Routage par fichiers yml
[Link] MVC
Autres contraintes (exprimées avec les expressions régulières)
[a-z] : toutes les lettres entre a et z
[abcd] : a, b, c, ou d
H I ©
UEL
MO
[A-Za-z] : une lettre en majuscule et une en minuscule
[ˆa-d] : tout sauf a, b, E
f L
c, et d
c h r e
©A
...
Pour utiliser un caractère réservé (ˆ, $...) dans une expression
régulière, il faut le précéder par \
H & H: Research and Training 12 / 30
Routage par fichiers yml
[Link] MVC
Pour indiquer que le nombre de paramètre est indéterminé, il faut
ajouter *
[Link](
name: "Default",
H I ©
url: "{controller}/{action}/{*id}",
UEL
O
LM
defaults: new { controller = "Home", action = "
r e f E
Index", id = [Link]}
);
ch
©A
H & H: Research and Training 13 / 30
Routage par fichiers yml
[Link] MVC
Pour indiquer que le nombre de paramètre est indéterminé, il faut
ajouter *
[Link](
name: "Default",
H I ©
url: "{controller}/{action}/{*id}",
UEL
O
LM
defaults: new { controller = "Home", action = "
r e f E
Index", id = [Link]}
);
ch
©A
Dans le contrôleur, il faut récupérer une chaı̂ne de caractère nommée
id contenant la suite de paramètres séparés par /
H & H: Research and Training 13 / 30
Routage par fichiers yml
[Link] MVC
Exercice
H I ©
Écrire une action d’un contrôleur [Link] qui
UEL
O
f E LM
récupère un nombre variable de paramètres de type entier
calcule la somme
ch r e
©A
envoie le résultat à la vue pour affichage
H & H: Research and Training 14 / 30
Routage par décorateurs
[Link] MVC
Pour utiliser les décorateurs, il faut H I ©
UEL
O
mettre en commentaire les routes définies dans RouteConfig
f E LM
ch r e
activer le routage par décorateur
©A
H & H: Research and Training 15 / 30
Routage par décorateurs
[Link] MVC
Nouveau contenu de RouteConfig
public class RouteConfig
{
public static void RegisterRoutes(
H I ©
RouteCollection routes)
UEL
{ O
E
[Link]("{resource}.axd/{*
f LM
pathInfo}");
ch r e
©A
// activer le routage par décorateur
[Link]();
}
}
H & H: Research and Training 16 / 30
Routage par décorateurs [Route]
[Link] MVC
Pour définir une route home/index
public HomeController : Controller
H I ©
EL
{
[Route("home/index")]
O U
public ActionResult Index()
f E LM
{
return View(); ch r e
}
} ©A
H & H: Research and Training 17 / 30
Routage par décorateurs [Route]
[Link] MVC
[Route] vs [ActionName] H I ©
UEL
O
[ActionName] fonctionne avec le routage par fichiers yml.
f E LM
[Route] fonctionne avec le routage par décorateurs.
ch r e
©A
H & H: Research and Training 18 / 30
Routage par décorateurs [Route]
[Link] MVC
Pour définir une route avec paramètre home/index/{id}
public HomeController : Controller
{
[Route("home/index/{id}")]
public ActionResult Index(string id)
H I ©
{
UEL
O
LM
[Link] = id;
return View();
r e f E
}
ch
}
©A
Dans la vue
@[Link]
Ne pas recevoir une valeur pour ce paramètre déclenche une
exception
H & H: Research and Training 19 / 30
Routage par décorateurs [Route]
[Link] MVC
Pour éviter l’exception
public HomeController : Controller
{
H I ©
[Route("home/index/{id?}")]
UEL
O
LM
public ActionResult Index(string id)
{
r e f E
[Link] = id;
ch
} ©A
return View();
H & H: Research and Training 20 / 30
Routage par décorateurs [Route]
[Link] MVC
Pour un paramètre de type entier
public HomeController : Controller
{
H I ©
[Route("home/index/{id:int}")]
UEL
O
LM
public ActionResult Index(int id)
{
r e f E
[Link] = id;
ch
} ©A
return View();
H & H: Research and Training 21 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Pour définir un préfixe pour toutes les routes d’un contrôleur
[RoutePrefix("home")]
public HomeController : Controller
{
H I ©
EL
[Route("index/{id:int}")]
public ActionResult Index(int id)
O U
{
f E LM
[Link] = id;
return View(); ch r e
}
} ©A
H & H: Research and Training 22 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Pour définir un préfixe pour toutes les routes d’un contrôleur
[RoutePrefix("home")]
public HomeController : Controller
{
H I ©
EL
[Route("index/{id:int}")]
public ActionResult Index(int id)
O U
{
f E LM
[Link] = id;
return View(); ch r e
}
} ©A
En saisissant home/index/3 dans la barre d’adresse, la méthode
Index de HomeController sera exécutée
H & H: Research and Training 22 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Pour détacher le préfixe de la route d’une méthode
[RoutePrefix("home")]
public HomeController : Controller
{
[Route("˜index/{id:int}")]
H I ©
public ActionResult Index(int id)
U EL
O
LM
{
[Link] = id;
r e f E
return View();
ch
}
}
©A
H & H: Research and Training 23 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Pour détacher le préfixe de la route d’une méthode
[RoutePrefix("home")]
public HomeController : Controller
{
[Route("˜index/{id:int}")]
H I ©
public ActionResult Index(int id)
U EL
O
LM
{
[Link] = id;
r e f E
return View();
ch
}
}
©A
En saisissant home/index/3 dans la barre d’adresse, on aura
une erreur. La route index/3 permet d’exécuter la méthode
Index de HomeController.
H & H: Research and Training 23 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Pour définir une valeur min pour le paramètre id
[RoutePrefix("home")]
public HomeController : Controller
{
[Route("˜index/{id:int:min{5}}")]
H I ©
public ActionResult Index(int id)
U EL
O
LM
{
[Link] = id;
r e f E
return View();
ch
}
}
©A
H & H: Research and Training 24 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Pour définir une valeur min pour le paramètre id
[RoutePrefix("home")]
public HomeController : Controller
{
[Route("˜index/{id:int:min{5}}")]
H I ©
public ActionResult Index(int id)
U EL
O
LM
{
[Link] = id;
r e f E
return View();
ch
}
}
©A
En saisissant index/3 dans la barre d’adresse, on aura une
erreur. La route index/6 permet d’exécuter la méthode Index de
HomeController.
H & H: Research and Training 24 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
On peut aussi utiliser les fonctions
max
H I ©
U EL
minlength et maxlength
O
range
f E LM
ch r e
©A
regex
...
H & H: Research and Training 25 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Exemple avec les expressions régulières
[RoutePrefix("home")]
public HomeController : Controller
{
H I ©
EL
[Route("˜/index/{id:regex(ˆ0.*9$)}")]
public ActionResult Index(int id)
O U
{
f E LM
[Link] = id;
return View(); ch r e
}
} ©A
H & H: Research and Training 26 / 30
Routage par décorateurs [RoutePrefix]
[Link] MVC
Exemple avec les expressions régulières
[RoutePrefix("home")]
public HomeController : Controller
{
H I ©
EL
[Route("˜/index/{id:regex(ˆ0.*9$)}")]
public ActionResult Index(int id)
O U
{
f E LM
[Link] = id;
return View(); ch r e
}
} ©A
Ainsi on impose une valeur pour le paramètre id qui commence
par 0 et qui se termine par 9.
H & H: Research and Training 26 / 30
Verbes HTTP
[Link] MVC
Rappel
H I ©
UEL
Par défaut, les actions d’un contrôleur sont accessibles par le
O
biais du verbe GET.
f E LM
ch r e
Cependant, il existe un décorateur pour chaque verbe HTTP.
©A
H & H: Research and Training 27 / 30
Verbes HTTP [HttpGet]
[Link] MVC
Pour indiquer explicitement le verbe HTTP GET, on utilise
[HttpGet]
public HomeController : Controller
H I ©
{
U EL
[HttpGet]
O
[Route("home/index")]
f E LM
public ActionResult Index()
ch r e
©A
{
return View();
}
}
H & H: Research and Training 28 / 30
Verbes HTTP [HttpPost]
[Link] MVC
Une action peut aussi être accessible par le biais de plusieurs
verbes HTTP
public HomeController : Controller
{ H I ©
[HttpPost]
U EL
O
[HttpGet]
[Route("home/index")]
f E LM
ch
public ActionResult Index() r e
{
©A
return View();
}
}
H & H: Research and Training 29 / 30
Verbes HTTP [AcceptVerbs]
[Link] MVC
On peut aussi fusionner les décorateurs précédents
public HomeController : Controller
{
H I ©
[AcceptVerbs([Link] | [Link])]
U EL
O
LM
[Route("home/index")]
public ActionResult Index()
r e f E
{
ch
} ©A
return View();
H & H: Research and Training 30 / 30