Неможливо отримати значення спеціального атрибута в Helper MVC3 HTML

Я розширив помічник HTML за допомогою методу, який потребує значення атрибута у властивості моделі. Тому я визначив власний атрибут як такий.

    public class ChangeLogFieldAttribute : Attribute {
        public string FieldName { get; set; }
    }

Це використовується у моїй моделі.

    [Display(Name = "Style")]
    [ChangeLogField(FieldName = "styleid")]
    public string Style { get; set; }

У моєму допоміжному методі я отримав такий код, щоб отримати значення FieldName мого атрибута, якщо атрибут використовується для властивості.

        var itemName = ((MemberExpression)ex.Body).Member.Name;

        var containerType = html.ViewData.ModelMetadata.ContainerType;
        var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault();
        if (attribute != null) {
            itemName = attribute.FieldName;
        }

Однак, коли я досягаю цього коду, я отримую виняток, оскільки containerType є нульовим.

Я не впевнений, чи правильно це робити, але я витягнув із близько чотирьох різних джерел, щоб отримати це далеко. Якщо б ви могли запропонувати виправити мою проблему чи альтернативу, я був би вдячний.

Дякую.

UPDATE WITH SOLUTION

Я використав рішення Даріна Димитрова, хоча мені довелося трохи налаштувати його. Ось що я додав. Мені довелося перевірити наявність атрибута metatadata і все було добре.

        var fieldName = ((MemberExpression)ex.Body).Member.Name;

        var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
        if (metadata.AdditionalValues.ContainsKey("fieldName")) { 
            fieldName = (string)metadata.AdditionalValues["fieldName"];
        }
5
Щоб отримати ім'я ресурсу, ви можете використовувати metadata.PropertyName замість ((MemberExpression) ex.Body) .Member.Name . Хоча це і не працює для імен полів, і я не бачу коду .FieldName або .MemberName .
додано Автор Matthew Flaschen, джерело

1 Відповіді

Ви можете усвідомити метадані атрибута:

public class ChangeLogFieldAttribute : Attribute, IMetadataAware
{
    public string FieldName { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["fieldName"] = FieldName;
    }
}

а потім всередині помічника:

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData);
var fieldName = metadata.AdditionalValues["fieldName"];
11
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug