2011-10-06 19 views
9

カスタムディスプレイまたはエディタテンプレートでは、,DisplayNameなど、特定のメタデータ属性がプロパティに定義されているかどうかを示すプロパティーを持つViewData.ModelMetadataでモデルに関するメタデータを取得できます。しかし、私はカスタム属性を使ってプロパティに追加したカスタムメタデータにアクセスできますか?例えばカスタムディスプレイまたはエディタテンプレートから追加のメタデータ情報にアクセスできますか?

、私の見解では、私はそうのような性質を持っていると言う:

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

そして、私は以下の内容をWhizbang.cshtmlという名前のカスタム表示テンプレートを持っている:

@model string 

Left Whizbang Value: @Model 

私は何をしたいです属性LeftWhizbangが属性SomeAttributeで装飾されているかどうかを判断することができます。そうであれば、属性のMessageプロパティ(つまり、値 "foobar")にアクセスしたいと思います。

@model string 

Left Whizbang Value: @Model 

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

が、これがすべてで可能です、または私は死んで終わりを下に探しています:

私は私のテンプレートでこのような何かを行うことができるようにしたいのですが?

答えて

14

DataAnnotationsModelMetadataProviderはそれについて

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

を知っているように、まずあなたがIMetadataAwareを実装して、あなたの属性が必要になりますあなたはその後、ヘルパーメソッドを作成することにより、属性にアクセスすることができます

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

非常に役に立った、共有のための感謝を! –

関連する問題