2011-10-06 7 views
9

Soy consciente de que en una plantilla personalizada de visualización o editor puedo obtener metadatos sobre el modelo a través del ViewData.ModelMetadata, que tiene propiedades que indican si se han definido ciertos atributos de metadatos para la propiedad, como IsRequired, DisplayName, etc. ¿Pero de todos modos puedo acceder a los metadatos personalizados que he agregado a la propiedad a través de atributos personalizados?¿Es posible acceder a información de metadatos adicional desde una pantalla personalizada o una plantilla de editor?

Por ejemplo, decir que en mi opinión, tengo una propiedad de este modo:

[UIHint("Whizbang")] 
[SomeAttribute("foobar")] 
public string LeftWhizbang { get; set; } 

Y tengo una plantilla de visualización personalizada denominada Whizbang.cshtml con el siguiente contenido:

@model string 

Left Whizbang Value: @Model 

lo que había gustaría hacer es determinar si la propiedad LeftWhizbang está decorada con el atributo SomeAttribute y, si es así, me gustaría acceder a la propiedad Message del atributo, es decir, el valor "foobar".

me gustaría ser capaz de hacer algo como esto en mi plantilla:

@model string 

Left Whizbang Value: @Model 

@{ 
    SomeAttributeAttribute attr = ViewData.ModelMetadata.GetAttributes(...); 
    if (attr != null) 
    { 
     <text>... and the value is @attr.Message</text> 
    } 
} 

¿Este es posible, o estoy mirando hacia abajo un callejón sin salida?

Respuesta

14

Sure. En primer lugar usted necesitará su atributo que implementa IMetadataAwareDataAnnotationsModelMetadataProvider modo que lo sabe

public class TooltipAttribute : Attribute, IMetadataAware { 
    public TooltipAttribute(string tooltip) { 
     this.Tooltip = tooltip; 
    } 

    public string Tooltip { get; set; } 

    public void OnMetadataCreated(ModelMetadata metadata) { 
     metadata.AdditionalValues["Tooltip"] = this.Tooltip; 
    } 
} 

A continuación, puede acceder al atributo mediante la creación de un método de ayuda:

public static IHtmlString TooltipFor<TModel, TValue>(
          this HtmlHelper<TModel> html, 
          Expression<Func<TModel, TValue>> expression) { 
    var data = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData); 
    if (data.AdditionalValues.ContainsKey("Tooltip")) 
     return new HtmlString((string)data.AdditionalValues["Tooltip"]); 

    return new HtmlString(""); 
} 
+0

muy útiles, gracias por compartir! –

Cuestiones relacionadas