Comment utiliser des attributs custom en ASP.Net MVC

Attributs-asp.net

En C#, les attributs permettent d’ajouter des métadonnées à une classe, une méthode, ou encore à une propriété. Les attributs apportent des informations complémentaires ou même appliquent des restrictions. De nombreux attributs préexistent dans le framework .Net, comme l’attribut « serializable » qui, placé avant la déclaration d’une classe, indique que l’objet créé à partir de cette classe pourra être sérialisé.

Néanmoins, il est possible de créer ses propres attributs ! Et c’est très simple : il suffit de créer une classe qui héritera de la classe System.Attribute. Cette action permet d’ajouter des informations personnalisées telles que le nom du développeur sur une classe ou méthode. En ASP.Net MVC, nous pouvons aller encore plus loin que le simple ajout de métadonnées et adjoindre des fonctionnalités directement dans des attributs.

 

Pour commencer, quels sont les différents types d’attributs ?

Il existe de nombreux types d’attributs. Connaissez-vous les deux principaux ?

  • Les attributs de type « ActionFilterAttribute » héritent de la classe ActionFilterAttribute, qui hérite elle-même de System.Attribute, permettent d’exécuter du code avant ou après une action.
  • Les attributs de type « ValidationAttribute » permettent de réaliser des validations de modèles personnalisés.

 

Quels sont leurs avantages et inconvénients ?

L’un des avantages d’utiliser un attribut personnalisé est d’éviter la répétition de code au sein de l’application et de rendre transparentes certaines actions qui ne viendront pas polluer leur code. Le code devient ainsi plus clair et plus lisible, puisque son exécution est désormais pratiquement invisible. Seule la présence du nom de l’attribut placé au-dessus de la méthode ou de la classe permet de savoir qu’il est appelé.

Mais c’est aussi là, que réside le principal danger…  Il n’apparaît pas toujours évident qu’un attribut personnalisé soit exécuté lors de l’appel d’une méthode. Ce qui risque de poser des problèmes de compréhension du code et de débogage, surtout si l’attribut est positionné au niveau de la classe, donc moins visible.

Il faut également être vigilant lorsque l’on utilise plusieurs attributs personnalisés qui s’avèrent dépendants. L’ordre dans lequel seront exécutés les attributs ne résulte pas totalement de l’ordre dans lequel ils sont ajoutés.

Pour être certain de ne pas rencontrer d’erreur à cause d’un ordre d’exécution erroné, il est alors possible d’utiliser la propriété « Order » présente par défaut dans certains types d’attributs, comme ceux de type « ActionFilter » ou « HttpMethodeAttribute. »

Image1

 

Quelques exemples de création d’attributs customs

Attribut de décryptage d’un paramètre

Pour illustrer un exemple d’attribut à créer, imaginons avoir besoin de véhiculer, via l’URL, un identifiant unique dans une application de plusieurs pages ou étapes. Pour des raisons de sécurité évidentes, ce paramètre sera alors crypté. Afin d’éviter de le décrypter dans chaque action, nous allons alors le déchiffrer avant même que l’action soit appelée, et disposer directement du paramètre « décrypter » dans la configuration de l’action.

Le code de l’attribut sera le suivant :

Image2

La classe hérite d’« ActionFilterAttribute », ce qui permet d’ overrider les méthodes suivantes :

Image4

Vous remarquerez également la présence de la propriété Order pouvant être utilisée lors de l’appel de l’attribut. Dans l’action « Index », encryptons une chaîne de caractères et redirigeons l’action « Etape1 » avec la chaine chiffrée dans l’URL, pour simuler l’arrivée dans une action avec un paramètre crypté.

Image5

Nous arrivons alors dans l’attribut avant l’action, qui va récupérer le paramètre dans la route, le décrypter et injecter la valeur décryptée dans les arguments de l’action. A noter que nous pourrions également appeler ici des méthodes du controller, ou récupérer des informations de la base de données.

Image7

Nous parvenons désormais à l’action « Etape1 » avec en argument decyptedString qui est bien alimenté avec la valeur d’origine.

Image8

 

Attribut de validation d’un champ

Un autre exemple d’attribut à réaliser, est un attribut de validation. Ici, nous créons une classe qui hérite de « ValidationAttribute » et override la méthode IsValid afin d’effectuer le contrôle personnalisé.

Image9

Pour utiliser cet attribut, il suffit alors de l’ajouter au-dessus de la propriété qui doit valider avec celui-ci. Plusieurs attributs peuvent être utilisées sur une propriété.

Image10

En conclusion, l’utilisation d’attributs permet de clarifier le code et d’ajouter des fonctionnalités simples et souvent répétées, sans pour autant polluer le code. De nombreux attributs existent déjà dans le framework .NET, mais il est possible d’en créer des personnalisés. Il faut cependant veiller à documenter leur utilisation, car de multiples actions peuvent être effectuées sans que ce soit très visible, surtout si l’attribut est apposé directement au niveau de la classe.

 

0 commentaires

votre commentaire

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *