Domanda

Brad Wilson ha registrato una grande serie di blog sui nuovi ModelMetaData di ASP.NET MVC: http: //bradwilson.typepad .com / blog / 2009/10 / aspnet-MVC-2-templates-parte-2-modelmetadata.html

In esso egli descrive come la classe ModelMetaData è ora esposta nelle viste e aiutanti su modelli. Quello che mi piacerebbe fare è visualizzare un asterisco accanto a un etichetta del campo modulo se il campo è obbligatorio, così ho pensato di usare la proprietà IsRequired di ModelMetaData. Tuttavia, IsRequired di default è vero per tutti gli immobili non annullabili, mentre è falsa per tutte le proprietà nullable. Il problema è che le stringhe sono sempre annullabile, pertanto la proprietà IsRequired è sempre false per le stringhe. Qualcuno sa come ignorare l'impostazione predefinita di come IsRequired è impostato? In alternativa, ho pensato di sfruttare l'attributo RequiredAttribute che ho che decorano le mie proprietà con, ma il RequiredAttribute non sembra essere esposti attraverso la classe ModelMetaData. Qualcuno sa come aggirare questo problema?

Grazie in anticipo.

È stato utile?

Soluzione

È necessario creare il proprio ModelMetadataProvider. Ecco un esempio utilizzando il 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;
        }
}

Poi, nel tuo AppStartup in Global.asax, si vuole mettere quanto segue per hookup la MyMetadataProvider come provider di metadati di default:

ModelMetadataProviders.Current = new MyMetadataProvider();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top