ASP.NET MVC ModelMetaData: ¿Hay una manera de establecer isRequired basado en la RequiredAttribute?

StackOverflow https://stackoverflow.com/questions/1662442

Pregunta

Brad Wilson registró una gran serie blog en nuevos ModelMetaData de ASP.NET MVC: http: //bradwilson.typepad .com / blog / 2009/10 / Red PEA-MVC-2-templates-parte-2-modelmetadata.html

En él, describe cómo la clase ModelMetaData está ahora expuesto en el dictamen y ayudantes de plantilla. Lo que me gustaría hacer es mostrar un asterisco al lado de una etiqueta de campo de formulario si el campo es obligatorio, así que pensé acerca del uso de la propiedad de isRequired ModelMetaData. Sin embargo, isRequired por defecto es cierto para todas las propiedades no anulables, mientras que es falsa para todas las propiedades con valores nulos. El problema es que las cadenas son siempre anulable, por lo que la propiedad isRequired siempre es falsa para cuerdas. ¿Alguien sabe cómo reemplazar el valor por defecto de cómo se establece isRequired? Alternativamente, pensé en aprovechar el atributo RequiredAttribute que he estado decorando con mis propiedades, pero no parece que la RequiredAttribute de estar expuestos a través de la clase ModelMetaData. ¿Alguien sabe cómo solucionar este problema?

Gracias de antemano.

¿Fue útil?

Solución

Es necesario crear su propio ModelMetadataProvider. Aquí hay un ejemplo usando el 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;
        }
}

A continuación, en su AppStartup en Global.asax, tendrá que poner lo siguiente en el de la conexión de MyMetadataProvider como el proveedor de metadatos por defecto:

ModelMetadataProviders.Current = new MyMetadataProvider();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top