web-dev-qa-db-fra.com

Quelle est la différence entre les attributs et les filtres dans MVC

Puis-je maintenant obtenir une comparaison et pas seulement une définition.

Exemple:

SomeClassAttribute (or ISomeClassAttribute)

CONTRE

SomeClassFilter (or ISomeClassFilter)

J'ai l'impression qu'ils peuvent être utilisés de la même manière, mais de manière générale "un attribut est appliqué" et un "filtre est la fonctionnalité qu'ils produisent". Je pouvais donc "ajouter un attribut à une méthode (ou classe ou autre) pour appliquer un filtre.

19
S.A.

"Donc je pourrais" ajouter un attribut à une méthode (ou classe ou autre) pour appliquer un filtre. "

Vous l'avez dans cette phrase là. Les filtres et Les attributs ne sont pas exactement des concepts comparables, ils remplissent deux fonctions différentes .

Je crois Le filtrage dans MVC est très bien couvert dans ce article MSDN .

Les attributs (au moins ceux qui s'appliquent aux filtres) indiquent à quoi le filtre est appliqué, c'est-à-dire une méthode d'action ou un contrôleur. Un exemple serait l'attribut Authorize. Cet attribut correspond à un AuthorizationFilter qui implémente l'interface IAuthorizationFilter. L'application de l'attribut Authorize à une méthode d'action indique à MVC d'autoriser une demande ciblant cette méthode d'action, son application à un contrôleur indique à MVC d'autoriser toute demande ciblant une méthode d'action du contrôleur, ou l'autorisation peut également être appliquée globalement pour toutes demandes. Maintenant, je l'ai déjà dit, au moins ceux qui s'appliquent aux filtres, car Les attributs sont un concept et une syntaxe de .NET et pas seulement MVC. Il y a des attributs pour tant d'autres choses et ils sont généralement destinés à fournir des informations supplémentaires sur la propriété, la méthode, la classe à laquelle ils sont appliqués.

12
asymptoticFault

Dans la plupart des cas, les attributs sont utilisés pour décrire les métadonnées sur les méthodes/classes/etc. Par exemple, il y a l'attribut Serializable pour indiquer qu'une classe peut être sérialisée, l'attribut TestClass pour marquer une classe comme test et l'attribut Obsolete pour marquer quelque chose comme obsolète. La réflexion est utilisée pour extraire ces informations par un processus qui souhaite les utiliser. C'est bien couvert dans cette question sur les attributs.

Les attributs de filtre dans MVC, tels que AuthorizeAttribute , transmettent des informations supplémentaires similaires à d'autres attributs - une méthode ou une classe de contrôleur décorée par AuthorizeAttribute indique qu'une autorisation est requise lorsqu'elle est utilisée par MVC. Mais contrairement à certains autres attributs, les attributs de filtre eux-mêmes contiennent une logique pour exécuter la fonction réelle - le AuthorizeAttribute dérive de Attribut (via FilterAttribute) et aussi = implémente IAuthorizationFilter . Lorsque MVC trouve une classe de contrôleur décorée par AuthorizeAttribute, il appellera la méthode AuthorizeAttribute.OnAuthorization () pour exécuter l'autorisation. De plus, lorsque vous spécifiez des filtres globaux, vous ajoutez la classe d'attributs elle-même à la liste des filtres, ce qui peut être un peu déroutant, mais c'est ainsi que cela fonctionne:

void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AuthorizeAttribute());
}
5
Dusklight

Les attributs sont une fonctionnalité de .NET, les filtres MVC sont implémentés à l'aide de cette fonctionnalité.

Par exemple, System.Web.Mvc.HandleErrorAttribute dérive de la BCL System.Attribute . Les filtres appliquent un comportement via des crochets dans le pipeline MVC (en gros).

4
SteveChapman