2011-10-06 17 views
9

Özel bir görüntüleyici veya düzenleyici şablonunda, model hakkında ViewData.ModelMetadata aracılığıyla meta veriler elde edebileceğimi biliyorum. Bu özellik, IsRequired, DisplayName vb. Gibi özellik için belirli meta veri özniteliklerinin tanımlanıp tanımlanmadığını gösteren özelliklere sahiptir. Ancak, özel nitelikler yoluyla mülke eklediğim özel meta verilere erişebilir miyim?Özel bir görüntüleyici veya düzenleyici şablonundan ek meta veri bilgilerine erişmek mümkün mü?

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

Ve aşağıdaki içeriği Whizbang.cshtml adlı özel gösterim şablon var: Örneğin

, ben şöyle bir özelliği vardır bana göre demek

@model string 

Left Whizbang Value: @Model 

Ne ediyorum LeftWhizbang özelliğinin SomeAttribute özniteliğine sahip olup olmadığını belirleyebilir ve eğer öyleyse, özniteliğin Message özelliğine (demek), yani "foobar" değerine erişmek isterim.

@model string 

Left Whizbang Value: @Model 

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

bu hiç mümkün mü, yoksa bir çıkmaz aşağı arıyorum:

Şablonumdaki böyle bir şey yapmak mümkün istiyorum?

cevap

14

Elbette.

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

Çok yararlı, teşekkürler paylaşım için: DataAnnotationsModelMetadataProvider bilmesi Daha sonra bir yardımcı yöntemi oluşturarak niteliğini erişebilirsiniz

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

hakkında Öncelikle IMetadataAware uygulayan niteliğini gerekir! –

İlgili konular