是否可以从自定义显示或编辑器模板访问其他元数据信息?

Sco*_*ell 10 asp.net-mvc-3

据我所知,在自定义显示或编辑模板,我可以得到关于通过模型元数据ViewData.ModelMetadata,它具有指示是否一定的元数据属性已为属性定义的属性,如IsRequired,DisplayName等.但无论如何我可以访问我通过自定义属性添加到属性的自定义元数据吗?

例如,在我看来,我有一个像这样的属性:

[UIHint("Whizbang")]
[SomeAttribute("foobar")]
public string LeftWhizbang { get; set; }
Run Code Online (Sandbox Code Playgroud)

我有一个名为Whizbang.cshtml以下内容的自定义显示模板:

@model string

Left Whizbang Value: @Model
Run Code Online (Sandbox Code Playgroud)

我想要做的是能够确定属性是否用属性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>
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都是可能的,还是我看着死胡同?

Bui*_*ted 14

当然.首先,您需要实现的属性,IMetadataAware以便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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过创建辅助方法来访问该属性:

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("");
}
Run Code Online (Sandbox Code Playgroud)