2009-11-02 12 views
13

Brad Wilson registró una gran serie blog en nuevos ModelMetaData de ASP.NET MVC: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.htmlASP.NET MVC ModelMetaData: ¿Hay alguna manera de establecer IsRequired en función del RequiredAttribute?

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 junto a una etiqueta de campo de formulario si el campo es obligatorio, así que pensé en usar la propiedad IsRequired de ModelMetaData. Sin embargo, IsRequired por defecto es verdadero para todas las propiedades que no admiten nulos, mientras que es falso para todas las propiedades que aceptan nulos. El problema es que las cadenas siempre son anulables, por lo que la propiedad IsRequired siempre es falsa para las cadenas. ¿Alguien sabe cómo anular el valor predeterminado de cómo se establece IsRequired? Alternativamente, pensé en aprovechar el atributo RequiredAttribute con el que he estado decorando mis propiedades, pero RequiredAttribute no parece estar expuesto a través de la clase ModelMetaData. ¿Alguien sabe cómo evitar este problema?

Gracias de antemano.

Respuesta

17

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

Luego, 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(); 
+0

Gracias. Este es exactamente el tipo de solución que estaba buscando. Sin embargo, parece que no puedo hacer que esto funcione correctamente. Incluso a través de mi propiedad está decorado con RequiredAttribute y se muestra correctamente en la lista de "atributos" en CreateMetadata(), attributes.Where (x => x.Equals (typeof (RequiredAttribute))) devuelve una lista vacía, lo que resulta en IsRequired sigue siendo falso ¿Hay algo mal que estoy haciendo con esta expresión lambda? –

+3

"x.Equals (typeof (RequiredAttribute))" debería decir "x es RequiredAttribute". * x * es una instancia de un atributo, no el tipo del atributo. – Levi

+0

Gracias Zowens y Levi. Mi problema ahora está resuelto. –

Cuestiones relacionadas