52 votes

Comparer System.ComponentModel.DataAnnotations vs System.Web.Mvc.Compare

Le projet MVC 4 Beta ne parvient pas à se compiler après la mise à niveau vers .Net 4.5.

Cela se produit en raison d'un conflit entre System.ComponentModel.DataAnnotations.CompareAttribute et System.Web.Mvc.CompareAttribute

System.ComponentModel.DataAnnotations.CompareAttribute documentation MSDN dit :

Fournit un attribut qui compare deux propriétés.

Tandis que System.Web.Mvc.CompareAttribute documentation MSDN dit :

Fournit un attribut qui compare deux propriétés d'un modèle.

Quelle est la différence entre les deux et quand serait-il "plus judicieux" d'utiliser chacun d'eux ?

Merci.

38voto

Vinney Kelly Points 1143

Donc, en regardant la documentation de MSDN et en faisant une comparaison littérale des deux classes, j'ai remarqué que les deux classes sont dérivées de System.ComponentModel.DataAnnotations.ValidationAttribute. En fait, les classes sont presque exactement les mêmes. La seule différence notable est que la version MVC implémente également IClientValidatable qui ajoute les propriétés suivantes :

  • FormatPropertyForClientValidation - (membre statique) Formate la propriété pour la validation côté client en préfixant un astérisque et un point.
  • GetClientValidationRules - Obtient une liste de règles de validation côté client pour comparer les valeurs de la propriété en utilisant les métadonnées du modèle spécifié et le contexte du contrôleur.

Quant à la classe que vous devriez utiliser, si le modèle est directement lié à une vue, utilisez la version MVC afin de tirer parti de la validation côté client. Cependant, si vous utilisez des ViewModels, vous pouvez rester avec la classe ComponentModel et éviter les surcharges inutiles des propriétés supplémentaires. À vous de décider !

16voto

Weej Points 424

La solution de contournement de Microsoft Connect est :

Posté par GavK le 17/06/2012 à 5:13

J'ai ajouté une référence complète à [System.Web.Mvc.Compare(...)] plutôt que simplement utiliser [Compare(...)]

Fonctionne pour moi dans VS 2012...

14voto

joelmdev Points 2215

Vinney a réussi la plupart du message, à l'exception de celui que vous devriez utiliser...

La raison pour laquelle vous avez un conflit après avoir changé votre cible de framework en 4.5 est que avant .NET 4.5 il n'y avait pas de classe CompareAttribute dans le namespace System.ComponentModel.DataAnnotations et la classe définie sous System.Web.Mvc comble le vide. Par conséquent, par exemple, si vous utilisiez les attributs [Compare] et [Required] dans votre classe modèle avant de mettre à jour votre cible de framework, vous vous retrouvez confronté à un conflit lorsque vous avez effectué la mise à jour.

En supposant que vous n'utilisez rien d'autre dans l'espace de noms System.Web.Mvc dans votre classe modèle, vous devriez supprimer cette using déclaration et laisser la dépendance sur l'espace de noms System.ComponentModel.DataAnnotations. La validation côté client sans entrave continuera à fonctionner exactement comme avant, tout comme pour les autres attributs dont vous décorez les propriétés de votre modèle du même espace de noms (par exemple Required).

6voto

user2665315 Points 61

Si vous souhaitez être explicite à propos de la référence, vous pouvez simplement ajouter cette ligne :

using CompareAttribute = System.Web.Mvc.CompareAttribute;

4voto

async Points 1477

En utilisant Visual Studio 2013 (projet MVC 5, .NET 4.5) l'IntelliSense suggère que System.Web.Mvc.CompareAttribute est obsolète.

J'ai utilisé System.ComponentModel.DataAnnotations.CompareAttribute et cela fonctionne bien. Il effectue également la validation côté client!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X