Comment utiliser des attributs custom en ASP.Net MVC

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

 

 

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 :

 

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

 

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

 

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.

 

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

 

 

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

 

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

 

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.