3-4 Routes dynamiques plus avancées
Le système de routes dynamiques fonctionne plutôt bien, mais imaginons que nous voulions ajouter une nouvelle action Edit
.
-
Modifier le contrôleur. Ajoutez une fonction
Edit()
au contrôleur://...
[HttpGet("evenements/{id:int}")]
public IActionResult Show(int id)
{
return Content($"Vue Show de EvenementsController, id: {id}");
}
[HttpGet("evenements/{id:int}/edit")]
public IActionResult Edit(int id)
{
return Content($"Vue Edit de EvenementsController, id: {id}");
}
/... -
Exécutez le projet. Allez vers le chemin
/evenements/1/edit
et vous devriez voir ceci dans votre navigateur:http://localhost:5155/evenements/1/editVue Edit de EvenementsController, id: 1
Ça fonctionne, mais allons-nous réécrire à chaque fois le préfixe
evenements/
dans[HttpGet("evenements/{le reste de la route}")]
pour chacune de nos routes?Cela ferait beaucoup de répétition, alors qu'au fond, on veut simplement que toutes les actions du contrôleur aient comme préfixe
evenements
...
Définir un gabarit de route au niveau du contrôleur
Heureusement, on peut définir un gabarit de route au niveau du contrôleur permettant aux routes d'avoir le même préfixe! Il s'agit de la route de base du contrôleur.
Ajoutez l'attribut suivante à l'en-tête de la classe EvenementsController
[Route("[controller]")]
public class EvenementsController : Controller
La ligne [Route("[controller]")]
informe l'application que toutes les actions de ce contrôleur auront comme préfixe le nom du contrôleur. C'est-à-dire evenements
dans notre cas. Pas besoin de le répéter à chaque fois.
Ajuster les routes d'action pour tenir compte du gabarit
Puisqu'un gabarit existe au niveau du contrôleur et ajoute automatiquement le préfixe evenements
pour toutes les actions du contrôleur, on peut simplifier les routes individuelles.
-
Modifiez les 2 actions pour ceci afin de simplifier
[HttpGet]
:[HttpGet("{id:int}")]
public IActionResult Show(int id)
{
return Content($"Vue Show de EvenementsController, id: {id}");
}
[HttpGet("{id:int}/edit")]
public IActionResult Edit(int id)
{
return Content($"Vue Edit de EvenementsController, id: {id}");
}infoPuisque nous avons défini un gabarit de route au niveau du contrôleur, pas besoin de répéter
evenements
pour les actions individuelles! Elles reprendront le préfixe utilisé par le contrôleur. -
Lancez le projet dans votre navigateur et naviguez vers
/evenements/1
et/evenements/1/edit
:http://localhost:5155/evenements/1Vue Show de EvenementsController, id: 1
http://localhost:5155/evenements/1/editVue Edit de EvenementsController, id: 1
Retour à la case départ en quelque sorte, mais au moins notre contrôleur ne répète pas constamment le préfixe
evenements
pour chacune des action.
Par contre, peut-être avez-vous remarqué, mais la page d'accueil ne répond plus!

Route vers la racine du site
On doit en quelque sorte déconnecter l'action Index()
du gabarit de route que nous avons défini et indiquer au système de routage que cette action représente la racine du site.
Cette manœuvre est à faire seulement pour ce contrôleur, puisqu'il contient la page d'accueil.
Modifiez l'action Index()
pour ceci:
[Route("/")]
public IActionResult Index()
Utiliser [Route("/")]
sur une action, on force l'action comme étant la page d'accueil du site et on la déconnecte du gabarit de route configuré au niveau du contrôleur.
Querystrings et paramètres optionnels
Il est utile parfois de passer des paramètres optionnels, via query string
par exemple. On peut s'en service pour préciser l'ordre d'affichage, ou une certaine catégorie à afficher:
- ?ordre=asc
- ?categorie=aventure
- ...
.NET Core MVC nous facilite grandement la vie. Il essaiera automatiquement de faire le lien entre un paramètre présent dans l'URL et un paramètre de la fonction associée à l'action.
Par exemple, sur la page d'affichage d'un événement, imaginez que vous désirez passer une certaine option par query string
.
Prenons comme exemple la situation pour laquelle on voudrait afficher une option tarifaire supplémentaire VIP pour un événement. On utiliserait une URL du type:
/evenements/1?option=vip
Pour supporter ce cas de figure, on peut:
-
Ajouter un paramètre optionnel à l'action:
[HttpGet("{id:int}")]
public IActionResult Show(int id, string? option)infoRemarquez le paramètre
option
ajouté à la fonctionShow()
.astuceUtiliser le caractère
?
permet de préciser que le paramètre est optionnel. -
Ensuite, utilisons le paramètre reçu dans la fonction:
[HttpGet("{id:int}")]
public IActionResult Show(int id, string? option)
{
return Content($"Vue Show de EvenementsController, id: {id}, option: {option}");
} -
** Compilez et lancez votre navigateur vers
/evenements/1
** pour obtenir ceci:http://localhost:5155/evenements/1Vue Show de EvenementsController, id: 1, option:
Maintenant, ajoutez l'option via
query string
:/evenements/1?option=vip
http://localhost:5155/evenements/1?option=vipVue Show de EvenementsController, id: 1, option: vip
Le paramètre a été automatiquement récupéré!