Для доступа к атрибутам вам понадобится пользовательский помощник Html
. Поскольку атрибуты на самом деле не являются частью свойства или модели, вам нужно обойти их.
public static IHtmlString DisplayName<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression) {
var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
return new HtmlString(metadata.DisplayName);
}
Для дополнительных атрибутов, которые не являются частью DataAnnotations, вы можете сделать следующее:
Создать пользовательский атрибут
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;
}
}
Волшебство происходит в реализации OnMetadataCreated. Здесь мы можем заполнить AdditionalValues всем, что нам нужно для нашего конкретного атрибута. В этом случае мы добавляем ключ всплывающей подсказки. Ваше имя должно быть уникальным, так как другие атрибуты или поставщики могут добавлять свои собственные ключи с тем же именем. Важно помнить, что атрибуты не всегда читаются в одном и том же порядке. Таким образом, ваш атрибут всплывающей подсказки может называться первым, последним или где-то посередине. Это важное различие, поскольку оно может вызвать нежелательные эффекты.
Затем создайте пользовательский помощник Атрибута
public static IHtmlString TooltipFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression) {
var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
if (metadata.AdditionalValues.ContainsKey("Tooltip"))
return new HtmlString((string)metadata.AdditionalValues["Tooltip"]);
return new HtmlString("");
}