这就是我一直在玩的东西。
我有这样的课程;
public partial class DespatchRoster : DespatchRosterCompare, IGuidedNav
{
public string despatchDay { get; set; }
}
我已经添加了元数据。
[MetadataType(typeof(RosterMetadata))]
public partial class DespatchRoster
{
}
public class RosterMetadata
{
[Display(Name="Slappy")]
public string despatchDay { get; set; }
}
在我的HTML中,我有以下内容;
<% PropertyInfo[] currentFields = typeof(DespatchRoster).GetProperties(); %>
<% foreach (PropertyInfo propertyInfo in currentFields){ %>
<li class="<%= propertyInfo.Name %>"><%= propertyInfo.Name %></li>
<%} %>
我想看到的是Slappy是LI而不是despatchDay。
我知道我以前做过这件事,但却想不出来。
答案 0 :(得分:1)
尝试使用this提到的下面一个。
private string GetMetaDisplayName(PropertyInfo property)
{
var atts = property.DeclaringType.GetCustomAttributes(
typeof(MetadataTypeAttribute), true);
if (atts.Length == 0)
return null;
var metaAttr = atts[0] as MetadataTypeAttribute;
var metaProperty =
metaAttr.MetadataClassType.GetProperty(property.Name);
if (metaProperty == null)
return null;
return GetAttributeDisplayName(metaProperty);
}
private string GetAttributeDisplayName(PropertyInfo property)
{
var atts = property.GetCustomAttributes(
typeof(DisplayNameAttribute), true);
if (atts.Length == 0)
return null;
return (atts[0] as DisplayNameAttribute).DisplayName;
}
答案 1 :(得分:0)
试试这个:
var properties = typeof(DespatchRoster ).GetProperties()
.Where(p => p.IsDefined(typeof(DisplayAttribute), false))
.Select(p => new
{
PropertyName = p.Name, p.GetCustomAttributes(typeof(DisplayAttribute),false)
.Cast<DisplayAttribute>().Single().Name
});
答案 2 :(得分:0)
试一试:
由于您正在访问“普通”MVC验证或显示模板之外的元数据,因此您需要自己注册TypeDescription
。
[MetadataType(typeof(RosterMetadata))]
public partial class DespatchRoster
{
static DespatchRoster() {
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(typeof(DespatchRoster), typeof(RosterMetadata)), typeof(DespatchRoster));
}
}
public class RosterMetadata
{
[Display(Name="Slappy")]
public string despatchDay { get; set; }
}
然后,要访问显示名称,我们需要使用TypeDescriptor
而不是普通PropertyInfo
方法枚举属性。
<% PropertyDescriptorCollection currentFields = TypeDescriptor.GetProperties(typeof(DespatchRoster)); %>
<% foreach (PropertyDescriptor pd in currentFields){ %>
<% string name = pd.Attributes.OfType<DisplayAttribute>().Select(da => da.Name).FirstOrDefault(); %>
<li class="<%= name %>"><%= name %></li>
<%} %>