Comment utiliser le routage d'attributs dans ASP.NET Core

L'intergiciel de routage dans ASP.NET Core est capable de mapper les demandes entrantes sur les gestionnaires de routage respectifs. Vous pouvez configurer le routage dans ASP.NET Core de deux manières différentes: le routage basé sur les attributs et le routage basé sur les conventions.

Contrairement au routage basé sur des conventions, dans lequel les informations de routage sont spécifiées à un emplacement unique, le routage d'attributs vous permet d'implémenter le routage en décorant vos méthodes d'action avec des attributs. Cet article présente une discussion sur la façon dont nous pouvons travailler avec le routage basé sur les attributs dans ASP.NET Core MVC.

Pour utiliser les exemples de code fournis dans cet article, vous devez disposer de Visual Studio 2019 installé sur votre système. Si vous n'en avez pas déjà une copie, vous pouvez télécharger Visual Studio 2019 ici. 

Créer un projet ASP.NET Core 3.1 MVC dans Visual Studio 2019

Tout d'abord, créons un projet ASP.NET Core dans Visual Studio 2019. En supposant que Visual Studio 2019 est installé sur votre système, suivez les étapes décrites ci-dessous pour créer un nouveau projet ASP.NET Core dans Visual Studio.

  1. Lancez l'IDE de Visual Studio.
  2. Cliquez sur "Créer un nouveau projet".
  3. Dans la fenêtre «Créer un nouveau projet», sélectionnez «Application Web ASP.NET Core» dans la liste des modèles affichés.
  4. Cliquez sur Suivant.
  5. Dans la fenêtre «Configurer votre nouveau projet», spécifiez le nom et l'emplacement du nouveau projet.
  6. Cochez éventuellement la case «Placer la solution et le projet dans le même répertoire», en fonction de vos préférences.
  7. Cliquez sur Créer.
  8. Dans la fenêtre «Créer une nouvelle application Web ASP.NET Core» affichée ci-dessous, sélectionnez .NET Core comme moteur d'exécution et ASP.NET Core 3.1 (ou version ultérieure) dans la liste déroulante en haut.
  9. Sélectionnez «Application Web (Model-View-Controller)» comme modèle de projet pour créer une nouvelle application ASP.NET Core MVC. 
  10. Assurez-vous que les cases à cocher «Activer le support Docker» et «Configurer pour HTTPS» ne sont pas cochées car nous n'utiliserons pas ces fonctionnalités ici.
  11. Assurez-vous que l'authentification est définie sur «Aucune authentification» car nous n'utiliserons pas non plus l'authentification.
  12. Cliquez sur Créer.

Suivre ces étapes créera un nouveau projet ASP.NET Core MVC dans Visual Studio 2019. Nous utiliserons ce projet dans les sections ci-dessous pour illustrer comment nous pouvons travailler avec le routage d'attributs dans ASP.NET Core 3.1.

Créer une classe de contrôleur dans ASP.NET Core MVC

Créez un nouveau contrôleur nommé DefaultController et remplacez le code source par défaut de DefaultController par le code suivant:

    public class DefaultController: Controller

    {

        [Route("")]

        [Route ("Par défaut")]

        [Route ("Default / Index")]

        Index ActionResult public ()

        {

            return new EmptyResult ();

        }

        [Route ("Default / GetRecordsById / {id}")]

        public ActionResult GetRecordsById (id int)

        {

            string str = string.Format

            ("L'id passé en paramètre est: {0}", id);

            return Ok (str);

        }

    }

Utiliser le routage d'attributs au niveau du contrôleur dans ASP.NET Core

Le routage d'attributs peut être utilisé à la fois au niveau du contrôleur et de la méthode d'action. Si nous appliquons l'attribut route au niveau du contrôleur, alors la route est applicable à toutes les méthodes d'action de ce contrôleur.

Si vous examinez notre classe DefaultController, vous observerez que la route Default est utilisée plusieurs fois lors de la spécification du modèle de route pour les méthodes d'action. L'extrait de code suivant montre comment vous pouvez spécifier différents attributs de route au niveau du contrôleur pour rendre l'utilisation plus flexible du routage d'attributs.

[Route ("Par défaut")]   

public class DefaultController: Controller

{

  [Route("")]

  [Route ("Index")]

  Index ActionResult public ()

  {

      return new EmptyResult ();

   }

  [HttpGet]

  Route ("Default / GetRecordsById / {id}")]

  public ActionResult GetRecordsById (id int)

  {

      string str = string.Format ("L'ID passé en paramètre est: {0}", id);

      return Ok (str);

   }

}

Lorsque vous utilisez des attributs de route à la fois au niveau du contrôleur et au niveau de la méthode d'action, le modèle de route appliqué au niveau du contrôleur est ajouté au modèle de route spécifié au niveau de la méthode d'action.

Vous aurez souvent besoin d'un préfixe commun pour votre contrôleur. Lorsque vous le faites, vous devez utiliser l'attribut [RoutePrefix] comme indiqué dans l'extrait de code ci-dessous.

[RoutePrefix ("services")]

public class HomeController: Contrôleur

{

   // Méthodes d'action

}

Utiliser le routage d'attributs au niveau de la méthode d'action dans ASP.NET Core

Reportez-vous à la classe DefaultController indiquée ci-dessus. Comme vous pouvez le voir, nous avons spécifié trois routes dans la méthode Index de la classe DefaultController. Cela implique que chacune des URL suivantes appellera la méthode d'action Index () du DefaultController.

// localhost: 11277

// localhost: 11277 / accueil

// localhost: 11277 / home / index

Comme dans le routage basé sur les conventions, vous pouvez également spécifier des paramètres dans le routage basé sur les attributs. En d'autres termes, le routage basé sur les attributs vous permet de spécifier des attributs d'itinéraire avec des paramètres. La méthode d'action GetRecordsById de la classe DefaultController présentée précédemment est un exemple.

Notez que "{id}" dans l'itinéraire spécifié représente un paramètre ou un espace réservé. Le paramètre id dans cet exemple peut être n'importe quoi, comme une chaîne ou un entier. Que faire si vous souhaitez limiter le paramètre aux entiers uniquement? Vous pouvez y parvenir en utilisant des contraintes.

Utiliser des contraintes d'itinéraire d'attribut dans une méthode d'action

Les contraintes de route sont utilisées pour contrecarrer les demandes invalides aux actions du contrôleur. Par exemple, vous souhaiterez peut-être vous assurer que le paramètre passé à une méthode d'action est toujours un entier. La syntaxe d'utilisation des contraintes d'itinéraire est {paramètre: contrainte}. L'extrait de code suivant illustre cela. Notez que le paramètre id ici est toujours un entier.

[Route ("Default / GetRecordsById / {id: int}")]

public ActionResult GetRecordsById (id int)

{

  string str = string.Format ("L'ID passé en paramètre est: {0}", id);

  return Ok (str);

}

Utiliser des paramètres facultatifs dans les spécifications d'itinéraire d'attribut

Vous pouvez également utiliser des paramètres facultatifs dans votre spécification d'itinéraire. L'extrait de code suivant montre comment cela peut être réalisé. Notez que la méthode d'action dans ce cas serait exécutée même si le paramètre id n'est pas passé.

[Route ("Sales / GetSalesByRegionId / {id?}")]

Il est important de comprendre que lorsque vous utilisez le routage d'attributs, ni le nom du contrôleur ni le nom de la méthode d'action ne jouent un rôle dans la sélection de la méthode d'action qui sera exécutée. Voyons cela avec un exemple. L'extrait de code suivant illustre la manière dont l'URL a été modifiée dans la spécification d'itinéraire pour la méthode d'action GetRecordsById.

[Route ("Home / GetRecordsById / {id: int}")]

public ActionResult GetRecordsById (id int)

{

   string str = string.Format ("L'ID passé en paramètre est: {0}", id);

   return Ok (str);

}

Vous pouvez maintenant appeler la méthode d'action GetRecordsById à l'aide de l'URL suivante:

// localhost: 11277 / home / GetRecordsById / 1

Utiliser plusieurs contraintes d'itinéraire d'attribut dans une méthode d'action

Il est également possible d'appliquer plusieurs contraintes à un paramètre. L'extrait de code suivant illustre comment cela peut être réalisé. Notez que la valeur minimale du paramètre id doit être 1, sinon une erreur 404 sera renvoyée.

[Route ("Default / GetRecordsById / {id: int: min (1)}")]

public ActionResult GetRecordsById (id int)

{

    string str = string.Format ("L'ID passé en paramètre est: {0}", id);

    return Ok (str);

}

Utiliser des verbes HTTP dans les routes d'attributs dans une méthode d'action

Vous pouvez même utiliser des verbes HTTP dans le routage d'attributs. L'extrait de code suivant montre comment cela peut être réalisé.

[HttpGet]

[Route ("Default / GetRecordsById / {id: int: min (1)}")]

public ActionResult GetRecordsById (id int)

{

  string str = string.Format ("L'ID passé en paramètre est: {0}", id);

  return Ok (str);

}

Contraintes de routage d'attributs couramment utilisées 

Voici une liste des contraintes d'itinéraire les plus couramment utilisées dans ASP.NET Core. 

  • booléen - utilisé pour correspondre à une valeur booléenne
  • datetime - utilisé pour correspondre à une valeur DateTime
  • décimal - utilisé pour correspondre à une valeur décimale
  • double - utilisé pour correspondre à une valeur à virgule flottante 64 bits
  • float - utilisé pour correspondre à une valeur à virgule flottante 32 bits
  • guid - utilisé pour correspondre à une valeur GUID
  • int - utilisé pour correspondre à une valeur entière de 32 bits
  • long - utilisé pour correspondre à une valeur entière de 64 bits
  • max - utilisé pour faire correspondre un entier avec une valeur maximale
  • min - utilisé pour faire correspondre un entier avec une valeur minimale
  • minlength - utilisé pour faire correspondre une chaîne avec une longueur minimale
  • regex - utilisé pour correspondre à une expression régulière

Créer des contraintes d'itinéraire d'attributs personnalisés 

Vous pouvez également créer vos propres contraintes d'itinéraire personnalisées en créant une classe qui étend l'interface IRouteConstraint et implémente la méthode Match comme indiqué dans l'extrait de code ci-dessous.

classe publique CustomRouteConstraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, route IRouter,

        chaîne routeKey,

        Valeurs RouteValueDictionary, RouteDirection routeDirection)

        {

            throw new NotImplementedException ();

        }

    }

Utiliser le remplacement de jeton dans les routes d'attribut au niveau du contrôleur

Le routage d'attributs dans ASP.NET Core MVC prend en charge une autre fonctionnalité intéressante appelée remplacement de jeton. Vous pouvez utiliser les jetons [action], [zone] et [contrôleur] dans votre contrôleur, et ces jetons seront respectivement remplacés par les noms d'action, de zone et de contrôleur. L'extrait de code suivant illustre comment cela peut être réalisé.

[Route ("[contrôleur] / [action]")]

public class HomeController: Contrôleur

{

   privé en lecture seule ILogger _logger;

   public HomeController (enregistreur ILogger)

   {

       _logger = enregistreur;

   }

   Index IActionResult public ()

   {

       retour Vue ();

   }

   // Autres méthodes d'action

}

Le routage d'attributs dans ASP.NET Core vous offre plus de contrôle et de flexibilité sur les URI de votre application Web. Bien que le routage basé sur les conventions puisse être configuré à un emplacement unique, qui peut à son tour être appliqué à tous les contrôleurs de votre application, il est difficile de prendre en charge certains modèles d'URI (tels que la gestion des versions d'API) avec le routage basé sur les conventions.

En utilisant le routage d'attributs, vous pouvez découpler les noms de contrôleur et d'action du modèle d'itinéraire. Vous pouvez même utiliser une combinaison de routage basé sur des conventions et de routage basé sur des attributs dans vos applications ASP.NET Core.

Comment faire plus dans ASP.NET Core:

  • Comment passer des paramètres aux méthodes d'action dans ASP.NET Core MVC
  • Comment utiliser les analyseurs d'API dans ASP.NET Core
  • Comment utiliser les jetons de données de route dans ASP.NET Core
  • Comment utiliser la gestion des versions d'API dans ASP.NET Core
  • Comment utiliser des objets de transfert de données dans ASP.NET Core 3.1
  • Comment gérer les erreurs 404 dans ASP.NET Core MVC
  • Comment utiliser l'injection de dépendances dans les filtres d'action dans ASP.NET Core 3.1
  • Comment utiliser le modèle d'options dans ASP.NET Core
  • Comment utiliser le routage de point de terminaison dans ASP.NET Core 3.0 MVC
  • Comment exporter des données vers Excel dans ASP.NET Core 3.0
  • Comment utiliser LoggerMessage dans ASP.NET Core 3.0
  • Comment envoyer des e-mails dans ASP.NET Core
  • Comment enregistrer des données sur SQL Server dans ASP.NET Core
  • Comment planifier des travaux à l'aide de Quartz.NET dans ASP.NET Core
  • Comment renvoyer des données à partir de l'API Web ASP.NET Core
  • Comment formater les données de réponse dans ASP.NET Core
  • Comment consommer une API Web ASP.NET Core à l'aide de RestSharp
  • Comment effectuer des opérations asynchrones à l'aide de Dapper
  • Comment utiliser les indicateurs de fonctionnalité dans ASP.NET Core
  • Comment utiliser l'attribut FromServices dans ASP.NET Core
  • Comment utiliser les cookies dans ASP.NET Core
  • Comment travailler avec des fichiers statiques dans ASP.NET Core
  • Comment utiliser le middleware de réécriture d'URL dans ASP.NET Core
  • Comment implémenter la limitation de débit dans ASP.NET Core
  • Comment utiliser Azure Application Insights dans ASP.NET Core
  • Utilisation des fonctionnalités NLog avancées dans ASP.NET Core
  • Comment gérer les erreurs dans l'API Web ASP.NET
  • Comment implémenter la gestion globale des exceptions dans ASP.NET Core MVC
  • Comment gérer les valeurs NULL dans ASP.NET Core MVC
  • Contrôle de version avancé dans l'API Web ASP.NET Core
  • Comment travailler avec les services de travail dans ASP.NET Core
  • Comment utiliser l'API de protection des données dans ASP.NET Core
  • Comment utiliser un middleware conditionnel dans ASP.NET Core
  • Comment travailler avec l'état de session dans ASP.NET Core
  • Comment écrire des contrôleurs efficaces dans ASP.NET Core