1

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

我有这样的课;

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。

我知道我以前做过,但不知道怎么做。

4

3 回答 3

1

尝试使用下面提到的这个

    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;
    }
于 2013-06-04T03:50:04.637 回答
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>
<%} %>
于 2013-06-13T05:00:11.410 回答
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
        });
于 2013-06-04T03:12:58.420 回答