MVC 5 使用对象上的属性来驱动 HtmlHelper 无法读取

MVC 5 using Attributes on Object to drive HtmlHelper unable to read

我有一个对象:具有多个属性(品牌、型号和颜色)的汽车。每个 属性 都有一个指定的属性 (BilingualLabel)。

我正在尝试为任何分配有 BilingualLabel 属性的类型编写强类型 htmlhelper。 IE。我想获取我归因于 Car class.

中的 属性 的 "MakeFR" 文本

例如

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

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

然后车class:

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

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

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

}

现在我来到助手class,我似乎无法获取我设置的属性值。我已经展示了我尝试过的两种尝试。它们都作为空属性返回。

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

现在您的 GetCustomAttribute 调用正试图从 typeof(E) 中获取 BilingualLabel,在您的情况下这将是一个字符串。您需要根据实际成员而不是类型获取自定义属性。此外,如果您想从自定义属性中取回您设置的值,您需要将其设置为 public 属性.

更新属性以具有 public 属性:

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