Aller au contenu principal

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.

  1. 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}");
    }
    /...
  2. Exécutez le projet. Allez vers le chemin /evenements/1/edit et vous devriez voir ceci dans votre navigateur:

    http://localhost:5155/evenements/1/edit

    Vue 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
info

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.

  1. 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}");
    }
    info

    Puisque 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.

  2. Lancez le projet dans votre navigateur et naviguez vers /evenements/1 et /evenements/1/edit:

    http://localhost:5155/evenements/1

    Vue Show de EvenementsController, id: 1

    http://localhost:5155/evenements/1/edit

    Vue 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!

http://localhost:5155/

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()
astuce

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:

  1. Ajouter un paramètre optionnel à l'action:

    [HttpGet("{id:int}")]
    public IActionResult Show(int id, string? option)
    info

    Remarquez le paramètre option ajouté à la fonction Show().

    astuce

    Utiliser le caractère ? permet de préciser que le paramètre est optionnel.

  2. 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}");
    }
  3. ** Compilez et lancez votre navigateur vers /evenements/1** pour obtenir ceci:

    http://localhost:5155/evenements/1

    Vue Show de EvenementsController, id: 1, option:

    Maintenant, ajoutez l'option via query string: /evenements/1?option=vip

    http://localhost:5155/evenements/1?option=vip

    Vue Show de EvenementsController, id: 1, option: vip

    Le paramètre a été automatiquement récupéré!

level up