displayname属性とdisplay属性


回答:


69

どちらも同じ結果になりますが、重要な違いは、ResourceTypein DisplayName属性を指定できないことです。MVC 2の例では、DisplayNameローカリゼーションを介してリソースを提供するために属性をサブクラス化する必要がありました。Display属性(MVC3および.NET4の新機能)はResourceType、「すぐに使える」プロパティとしてオーバーロードをサポートします。


1
知っておきたい!.resxファイルから表示値をロードするカスタム属性を実装しようとしていたところ、この質問が発生しました。表示属性は、ローカライズされたアプリケーションを開発するときの方法です。
カールハインリッヒハンケ

148

DisplayNameDisplayNameモデルのメタデータにを設定します。例えば:

[DisplayName("foo")]
public string MyProperty { get; set; }

そしてあなたがあなたの見解で以下を使用するならば:

@Html.LabelFor(x => x.MyProperty)

それは生成されます:

<label for="MyProperty">foo</label>

Display 同じことを行いますが、名前、説明などの他のメタデータプロパティを設定することもできます

Brad Wilsonが、これらの属性をカバーする素晴らしいブログ投稿を公​​開しています。


1
+1-おそらく私のものよりはるかに便利です(現在は削除されています); 私には早すぎます:)
Andras Zoltan

PropertyDescriptorで問題があり、Display(name ..を使用して@ descriptor.DisplayNameを呼び出すと、Display(name ..)ではなくDisplayNameを使用した場合のみ機能します。)
eaglei22

24

現在の回答では、実際の重要な違いと重要な違い、および意図された使用法にとってそれが何を意味するかを強調するために無視されていると思います。実装者は両方のサポートを組み込んでいるため、特定の状況では両方とも機能する可能性がありますが、使用シナリオは異なります。どちらもプロパティとメソッドに注釈を付けることができますが、いくつか重要な違いがあります:

DisplayAttribute

  • アセンブリのSystem.ComponentModel.DataAnnotations名前空間で定義されていますSystem.ComponentModel.DataAnnotations.dll
  • パラメータとフィールドで使用できます
  • Descriptionまたはなどの追加プロパティを設定できますShortName
  • リソースでローカライズできます

DisplayNameAttribute

  • DisplayNameは次のSystem.ComponentModel名前空間にありますSystem.dll
  • クラスやイベントで使用できます
  • リソースでローカライズできません

アセンブリと名前空間は、意図した使用法を示しており、ローカリゼーションのサポートは非​​常に重要です。DisplayNameAttributeは.NET 2以降に存在し、開発者のコ​​ンポーネントとレガシープロパティグリッドでのプロパティの命名を目的としたものであり、ローカリゼーションなどを必要とする可能性のあるエンドユーザーに表示されるものではありません。

DisplayAttributeは後で.NET 4で導入され、エンドユーザーに表示されるデータクラスのメンバーにラベルを付けるために特別に設計されたように思われるため、DTO、エンティティ、およびその他の種類のものに適しています。クラスで使用できないように制限されているのは残念です。

編集:最新の.NET CoreソースがDisplayAttributeクラスでも使用できるようになりました。


13

おそらくこれは.netコアに固有のものです。DisplayNameは機能しませんが、Display(Name = ...)は機能します。これにより、他の誰かが関係するトラブルシューティングを節約できます:)

//using statements
using System;
using System.ComponentModel.DataAnnotations;  //needed for Display annotation
using System.ComponentModel;  //needed for DisplayName annotation

public class Whatever
{
    //Property
    [Display(Name ="Release Date")]
    public DateTime ReleaseDate { get; set; }
}


//cshtml file
@Html.DisplayNameFor(model => model.ReleaseDate)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.