2010-09-28 11 views
2

Voici un exemple de la façon dont il fonctionne maintenant:Existe-t-il un moyen d'instruire ASP.NET MVC à propos de certaines métadonnées de classe autres que de placer MetadataTypeAttribute directement dans la classe?

[MetadataType(typeof(PersonMetadata))] 
public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public class PersonMetadata 
{ 
    [Required] 
    public string Name { get; set; } 
    [Range(0,150] 
    public int Age { get; set; } 
} 

Cependant, je ne veux pas le MetadataAttribute à mettre sur la classe Person, au lieu que je veux une certaine façon de dire au framework MVC « hey si vous rencontrez personne class the metadate est dans la classe PersonMetadata ". Il est juste en train d'inverser la direction qui, pour moi, semble plus compositionnelle et suivre le principe de l'ouverture-fermeture puisque je n'ai pas besoin de toucher la classe Person pour "l'étendre" avec des métadonnées.
Je sais que cela crée un problème de rattachement de métadonnées multiples et conflictuelles, augmente également la complexité mais la flexibilité a toujours un prix.

Je veux soit une manière programmatique ou déclarative ou de préférence les deux :)

Donc, on pourrait être quelque chose comme:

MetadataTypeMappings.Add(typeof(Person), typeof(PersonMetadata)); 

Une autre pourrait être:

[MetadataFor(typeof(Person)] 
public class PersonMetadata 
{ 
    [Required] 
    public string Name { get; set; } 
    [Range(0,150] 
    public int Age { get; set; } 
} 
+0

Bon quetsion. J'imagine que vous pourriez aussi adopter une approche basée sur une convention. Probablement un classeur de modèle personnalisé est la voie à suivre, mais peut-être quelqu'un d'autre qui a traité cela auparavant peut remplir les détails. – UpTheCreek

Répondre

3

J'utilise MvcExtensions. L'une des caractéristiques est une belle façon de décrire les métadonnées comme ceci:

public class ProductEditModelConfiguration : 
    ModelMetadataConfiguration<ProductEditModel> 
{ 
    public ProductEditModelConfiguration() 
    { 
    Configure(model => model.Id).Hide(); 
    Configure(model => model.Name) 
     .DisplayName(() => LocalizedTexts.Name) 
     .Required(() => LocalizedTexts.NameCannotBeBlank) 
     .MaximumLength(64,() => 
     LocalizedTexts.NameCannotBeMoreThanSixtyFourCharacters); 
    } 
} 

chose Neat est - ce qui permet d'utiliser des ressources pour la localisation dans la mode fortement typé. Inconvénient pour l'utilisation de ceci - il y a beaucoup d'autres choses que vous pourriez ne pas vouloir utiliser.

+0

Si c'est fait par programme alors il doit y avoir un moyen :) –

+0

Je dois le regarder et même si je n'utilise pas MvcExtensions directement je pourrais trouver comment le faire moi-même. –

+0

@Piotr Ces éléments sont appelés fournisseurs de métadonnées de modèle personnalisé. Mais je pense que c'est assez frais de les écrire par vous-même. Assez difficile. Mais oui, MvcExtensions vous montrerait comment faire cela si vous voulez aller de cette façon: http://bit.ly/aIlaLh. Et vous pourriez trouver utile cette présentation: http://bit.ly/aFOMJH. –