Получение значения атрибута [Description] в CSHTML - PullRequest
1 голос
/ 27 марта 2019

Я бы хотел использовать в cshtml описание свойства / поля из Description атрибута

Возможно ли сделать это так же легко, как с DisplayName, используя @Html.DisplayNameFor(x => ...), или мне нужно "извлечь это"

public class Test
{
    [Description("Test description")]
    public bool Name { get; set; }
}

Я пробовал что-то подобное, но безуспешно

var desc = typeof(Test)
.GetCustomAttributes(false)
.ToDictionary(a => a.GetType().Name, a => a);

или

typeof(Test).Attributes

typeof(Test).GetCustomAttributesData();

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Вы можете просто написать собственный HtmlHelper для этого:

public static class HtmlHelpers
{
    public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        if (expression == null)
            throw new ArgumentNullException(nameof(expression));

        DescriptionAttribute descriptionAttribute = null;
        if (expression.Body is MemberExpression memberExpression)
        {
            descriptionAttribute = memberExpression.Member
                .GetCustomAttributes(typeof(DescriptionAttribute), false)
                .Cast<DescriptionAttribute>()
                .SingleOrDefault();
        }

        return new HtmlString(descriptionAttribute?.Description ?? string.Empty);
    }
}
0 голосов
/ 27 марта 2019

Мне удалось сделать это с помощью этого кода:

public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
    if (html == null) throw new ArgumentNullException(nameof(html));
    if (expression == null) throw new ArgumentNullException(nameof(expression));

    var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, html.ViewData, html.MetadataProvider);
    if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {ExpressionHelper.GetExpressionText(expression)}");

    var metadata = (DefaultModelMetadata)modelExplorer?.Metadata;

    if (metadata == null)
    {
        return new HtmlString(string.Empty);
    }

    var text = (metadata
                .Attributes
                .Attributes // yes, twice
                .FirstOrDefault(x => x.GetType() == typeof(DescriptionAttribute)) as DescriptionAttribute)
                ?.Description;

     var output = HttpUtility.HtmlEncode(text ?? string.Empty);

     return new HtmlString(output);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...