我知道在自定义显示或编辑器模板中,我可以通过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
这是完全可能的,还是我看不起死胡同?
答案 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("");
}