ASP.NET MVCのDisplayName
属性とDisplay
属性の違いは何ですか?
どちらも同じ結果になりますが、私が見る主な違いは、ResourceType
属性にDisplayName
を指定できないことです。 MVC 2の例では、DisplayName
属性をサブクラス化して、ローカライズによってリソースを提供する必要がありました。 Display
属性(MVC3および.NET4の新機能)は、「すぐに使える」プロパティとしてResourceType
オーバーロードをサポートしています。
DisplayName
は、モデルメタデータのDisplayName
を設定します。例えば:
[DisplayName("foo")]
public string MyProperty { get; set; }
ビューで次を使用する場合:
@Html.LabelFor(x => x.MyProperty)
以下を生成します:
<label for="MyProperty">foo</label>
Display
は同じことを行いますが、名前、説明などの他のメタデータプロパティを設定することもできます...
Brad Wilsonには、これらの属性をカバーする Nice blog post があります。
現在の答えは、実際の重要で重要な違いと、それが意図された用途にとって何を意味するかを強調することを怠っていると思います。実装者が両方のサポートを組み込んでいるため、両方とも特定の状況で機能する可能性がありますが、使用シナリオは異なります。どちらもプロパティとメソッドに注釈を付けることができますが、ここにいくつかの重要な違いがあります。
DisplayAttribute
System.ComponentModel.DataAnnotations
アセンブリのSystem.ComponentModel.DataAnnotations.dll
名前空間で定義Description
やShortName
などの追加のプロパティを設定できますDisplayNameAttribute
System.ComponentModel
のSystem.dll
名前空間にありますアセンブリと名前空間は意図された使用法に対応しており、ローカライズのサポートが重要です。 DisplayNameAttribute
は.NET 2以降登場しており、開発者コンポーネントやレガシープロパティグリッド内のプロパティの命名を目的としており、ローカライズなどが必要なエンドユーザーに見えるものにはあまり向いていません。
DisplayAttribute
は.NET 4で導入され、エンドユーザーに表示されるデータクラスのメンバーにラベルを付けるために特別に設計されているようです。そのため、DTO、エンティティ、その他の種類のものに適しています。クラスで使用できないように制限しているのはかなり残念です。
編集:最新の.NET Coreソースにより、DisplayAttribute
をクラスでも使用できるようになりました。
おそらくこれは.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)