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

时间:2011-10-06 23:16:10

标签: asp.net-mvc-3

我知道在自定义显示或编辑器模板中,我可以通过ViewData.ModelMetadata获取有关模型的元数据,IsRequired具有指示是否已为属性定义某些元数据属性的属性,例如{{1} },DisplayName等等。但是,无论如何我可以访问我通过自定义属性添加到属性的自定义元数据吗?

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

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

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

@model string

Left Whizbang Value: @Model

我想要做的是能够确定属性LeftWhizbang是否使用属性SomeAttribute进行修饰,如果是,我想要访问属性{{1}属性(比如),即值“foobar”。

我希望能够在我的模板中做到这样的事情:

Message

这是完全可能的,还是我看不起死胡同?

1 个答案:

答案 0 :(得分: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;
    }
}

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

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("");
}