MVC 5, использующий атрибуты объекта, чтобы диск HtmlHelper не мог прочитать

У меня есть объект: Автомобиль с несколькими свойствами (Марка, Модель и Цвет). Каждое свойство имеет назначенный атрибут (BilingualLabel).

Я пытаюсь написать строго тип htmlhelper для любого типа, которому присвоен атрибут BilingualLabel. Т.е. я хочу заполучить текст "MakeFR", который я приписал свойству в классе Car.

Например

[System.AttributeUsage(AttributeTargets.Property)]
public class BilingualLabel : System.Attribute
{
    private string _resourceCode = "";

    public BilingualLabel(string ResourceCode)
    {
        _resourceCode = ResourceCode;
    }
}

Тогда класс машины:

public class Car
{
    [BilingualLabel("MakeFR")]
    public string Make { get; set; }

    [BilingualLabel("ModelFR")]
    public string Model { get; set; }

    [BilingualLabel("ColorFR")]
    public string Color { get; set; }

}

Теперь я перехожу к вспомогательному классу и, похоже, не могу получить значение атрибута, которое я установил. Я показал две попытки, которые попробовал. Они оба возвращаются как пустые атрибуты.

    public static MvcHtmlString BilingualLabelFor<T,E>(this HtmlHelper<T> htmlHelper, Expression<Func<T,E>> expression)
    {

        //get the Bilingual Label resource code

        //BilingualLabel attr =
        //    (BilingualLabel)Attribute.GetCustomAttribute(typeof(E), typeof(BilingualLabel));

        MemberExpression member = expression.Body as MemberExpression;
        PropertyInfo propInfo = member.Member as PropertyInfo;


        MvcHtmlString html = default(MvcHtmlString);

        return html;
    }

1 ответ

Решение

Прямо сейчас ваш вызов GetCustomAttribute пытается получить BilingualLabel от typeof(E) которая будет строкой в ​​вашем случае. Вам нужно получить пользовательский атрибут на основе фактического члена вместо типов. Кроме того, если вы хотите получить значение, которое вы устанавливаете обратно, из пользовательского атрибута, вам нужно установить его в публичное свойство.

Обновите атрибут, чтобы иметь открытое свойство:

[System.AttributeUsage(AttributeTargets.Property)]
public class BilingualLabel : System.Attribute
{
    public string ResourceCode { get; private set; }

    public BilingualLabel(string resourceCode)
    {
        this.ResourceCode = resourceCode;
    }
}

Затем вытяните GetCustomAttribute из члена вместо типа:

public static MvcHtmlString BilingualLabelFor<T,E>(this HtmlHelper<T> htmlHelper, Expression<Func<T,E>> expression)
{

    MvcHtmlString html = default(MvcHtmlString);

    MemberExpression memberExpression = expression.Body as MemberExpression;
    BilingualLabel attr = memberExpression.Member.GetCustomAttribute<BilingualLabel>();

    if (attr != null)
    {
      //Replace with actual lookup code to get Bilingual Label using attr.ResourceCode
      html = new MvcHtmlString(attr.ResourceCode);
    }

    return html;
}
Другие вопросы по тегам