在HTML页面中显示时获取类的Display属性

时间:2013-06-04 03:07:50

标签: c# asp.net-mvc system.componentmodel

这就是我一直在玩的东西。

我有这样的课程;

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。

我知道我以前做过这件事,但却想不出来。

3 个答案:

答案 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>
<%} %>