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

私が見たいのは、DespatchDay ではなく LI としての Slappy です。

以前にこれを行ったことがあることは知っていますが、方法がわかりません。

4

3 に答える 3

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;
    }
于 2013-06-04T03:50:04.637 に答える
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 に答える
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 に答える