2009-11-02 7 views
13

a affiché une grande série de blog sur les nouvelles ModelMetaData de ASP.NET MVC: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.htmlASP.NET MVC ModelMetaData: existe-t-il un moyen de définir IsRequired en fonction de RequiredAttribute? Brad Wilson

Dans ce document, il décrit comment la classe ModelMetaData est maintenant exposée dans les vues et les aides templated. Qu'est-ce que je voudrais faire est d'afficher un astérisque à côté d'un label de champ de formulaire si le champ est requis, donc j'ai pensé à l'aide de la propriété IsRequired de ModelMetaData. Toutefois, IsRequired par défaut est true pour toutes les propriétés non nullable, alors qu'il est false pour toutes les propriétés Nullable. Le problème est que les chaînes sont toujours NULL, donc la propriété IsRequired est toujours false pour les chaînes. Est-ce que quelqu'un sait comment remplacer la valeur par défaut de la façon dont IsRequired est défini? Alternativement, j'ai pensé tirer parti de l'attribut RequiredAttribute avec lequel j'ai décoré mes propriétés, mais le RequiredAttribute ne semble pas être exposé à travers la classe ModelMetaData. Est-ce que quelqu'un sait comment contourner ce problème?

Merci d'avance.

Répondre

17

Vous devez créer votre propre ModelMetadataProvider. Voici un exemple en utilisant le DataAnnotationsModelBinder

public class MyMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
     protected override ModelMetadata CreateMetadata(Collections.Generic.IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
     { 
      var _default = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
      _default.IsRequired = attributes.Where(x => x is RequiredAttribute).Count() > 0; 
      return _default; 
     } 
} 

Puis dans votre AppStartup à Global.asax, vous voulez mettre ce qui suit dans le MyMetadataProvider pour brancher des en tant que fournisseur de métadonnées par défaut:

ModelMetadataProviders.Current = new MyMetadataProvider(); 
+0

Merci. C'est exactement le genre de solution que je cherchais. Cependant, je n'arrive pas à faire fonctionner cela correctement. Même à travers ma propriété est décorée avec RequiredAttribute et il apparaît correctement dans la liste "attributes" dans CreateMetadata(), attributs.Where (x => x.Equals (typeof (RequiredAttribute))) renvoie une liste vide, ce qui entraîne IsRequired toujours être faux. Y at-il quelque chose qui ne va pas avec cette expression lambda? –

+3

"x.Equals (typeof (RequiredAttribute))" doit indiquer "x is RequiredAttribute". * x * est une instance d'un attribut, pas le type de l'attribut. – Levi

+0

Merci Zowens et Levi. Mon problème est maintenant résolu. –