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;
}
我有一个对象:具有多个属性(品牌、型号和颜色)的汽车。每个 属性 都有一个指定的属性 (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;
}