Можно ли получить доступ к дополнительной информации метаданных из пользовательского шаблона отображения или редактора? - PullRequest
9 голосов
/ 07 октября 2011

Мне известно, что в пользовательском шаблоне отображения или редактора я могу получить метаданные о модели через ViewData.ModelMetadata, у которого есть свойства, которые указывают, были ли определенные атрибуты метаданных для свойства, такие как IsRequired, DisplayName, и так далее. Но можно ли в любом случае получить доступ к пользовательским метаданным, которые я добавил к свойству, через пользовательские атрибуты?

Например, скажем, на мой взгляд, у меня есть такое свойство:

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

Это вообще возможно, или я заглядываю в тупик?

1 Ответ

14 голосов
/ 07 октября 2011

Конечно. Сначала вам понадобится ваш атрибут, который реализует 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("");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...