Question

Brad Wilson 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-modèles-partie-2-modelmetadata.html

Dans ce document, il décrit comment la classe ModelMetaData est maintenant exposée dans les vues et les aides templated. Ce que je voudrais faire est d'afficher un astérisque à côté d'une étiquette de champ de formulaire si le champ est nécessaire, donc je pensais que sur l'utilisation de la propriété IsRequired de ModelMetaData. Cependant, IsRequired par défaut est vrai pour toutes les propriétés non nulle, alors qu'il est faux pour toutes les propriétés nullables. Le problème est, les chaînes sont annulable, donc la propriété IsRequired est toujours fausse pour les chaînes. Est-ce que quelqu'un sait comment remplacer la valeur par défaut de la façon dont IsRequired est réglé? Sinon, je pensais à tirer parti de l'attribut RequiredAttribute que j'ai décorent mes propriétés avec, mais le RequiredAttribute ne semble pas être exposé par la classe ModelMetaData. Est-ce que quelqu'un sait comment contourner ce problème?

Merci d'avance.

Était-ce utile?

La solution

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;
        }
}

Alors 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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top