3

J'utilise une classe générée comme modèle, et je souhaite ajouter des attributs DataAnnotation à certaines de ses propriétés. Comme c'est un code généré, je ne veux pas ajouter les annotations directement. Y a-t-il un autre moyen de les attacher à une propriété?Puis-je ajouter des attributs MVC 2 DataAnnotation aux propriétés existantes?

J'avais envisagé de faire du modèle une interface, et d'utiliser une classe partielle pour que la classe générée s'y abonne. Existe-t-il une solution moins élaborée, à supposer que cela fonctionne même?

Répondre

6

Oui il y a. Vous devez créer la classe de métadonnées qui ont les mêmes propriétés que votre modèle d'origine, et connectez-le à votre modèle avec l'attribut MetadataType:

[MetadataType(typeof(MyModelMetadata))] 
public partial class OriginalMyModel 
{ 
} 

public class MyModelMetadata 
{ 
    [Required] 
    public string MyProperty; 

    // ... 
} 

Dans l'exemple ebove OriginalModel est votre classe appropriée modèle et MyModelMetadata est une classe utilisé uniquement pour les propriétés d'annotation. MyModelMetadata devrait avoir les mêmes propriétés que votre modèle.

+0

Vous pouvez utiliser MyModelMetadata partielle de classe publique car vous ciblez souvent des partiels sur Entity Framework/LINQ to SQL ... même si ce n'est pas agréable d'avoir un code de sortie distinct. –

+0

Merci. C'est exactement ce que je recherche Puis-je aussi faire cela pour ajouter des attributs de sérialisation aux classes générées? Ou est-ce que le MVC est spécifique? Et quand vous dites que la classe de métadonnées doit avoir les mêmes propriétés, cela signifie-t-il –

+0

Les attributs DataAnnotation sont complètement indépendants de MVC, ils ne sont que l'une des nombreuses façons de gérer la validation, et le classeur par défaut MVC2 les utilise par défaut. Vous n'avez pas besoin d'avoir toutes les propriétés du modèle - seules celles qui ont besoin d'être annotées sont nécessaires.Que voulez-vous dire par attributs de sérialisation? – PanJanek

2

Vous pouvez utiliser l'attribut MetadataType de votre classe:

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx

Dans la pratique, j'ai vu les métadonnées désynchronisés avec un assez souvent modèle généré, mais, ce qui peut conduire à des maux de tête. Vous souhaiterez peut-être examiner un autre mécanisme de validation au lieu des annotations de données.

J'ai utilisé Fluent Validation, qui est très facile à prendre en main et à utiliser. Il y a même un élément d'intégration Fluent Validation to xVal dans Fluent Validation 2.0 (toujours en version bêta) que vous pouvez intégrer dans votre projet pour la validation côté client. Fluent Validation vous permet de définir votre validation dans une classe distincte.

Tout ce que vous devez faire est d'ajouter un attribut à votre classe générée en lui disant quel validateur utiliser, ce qui pourrait être accompli par des classes partielles. Vous pouvez également créer des modèles spécifiques à la vue mappés à partir de votre modèle de domaine contenant vos annotations de données. Dans ce cas, simplifiez le mappage de va-et-vient en utilisant quelque chose comme AutoMapper. Ensuite, si votre modèle de domaine change, vous obtenez des erreurs de compilation par rapport à l'approche des métadonnées.

+0

DataAnnotationValidators sont très flexibles cadre de validation -built pour .NET aller de l'avant.Beaucoup de vraies techniques de validation nice là-bas comme xVal etc., mais je suis parti à les utiliser en particulier avec ASP.NET MVC. –

Questions connexes