ASP.NET MVCのDisplayName
属性と属性の違いは何ですか?Display
4 に答える
DisplayName
DisplayName
モデルメタデータにを設定します。例えば:
[DisplayName("foo")]
public string MyProperty { get; set; }
ビューで次を使用する場合:
@Html.LabelFor(x => x.MyProperty)
それは生成します:
<label for="MyProperty">foo</label>
Display
同じことを行いますが、名前、説明、...などの他のメタデータプロパティを設定することもできます。
Brad Wilsonは、これらの属性をカバーする素晴らしいブログ投稿をしています。
どちらも同じ結果が得られますが、重要な違いはResourceType
inDisplayName
属性を指定できないことです。MVC 2 の例では、DisplayName
属性をサブクラス化して、ローカリゼーションによってリソースを提供する必要がありました。Display
属性 (MVC3 および .NET4 の新機能) はResourceType
、「すぐに使える」プロパティとしてオーバーロードをサポートします。
現在の回答は、実際の重要で重要な違いと、それが意図した使用法にとって何を意味するかを強調することを怠っていると思います。実装者が両方のサポートを組み込んでいるため、特定の状況では両方とも機能する可能性がありますが、使用シナリオは異なります。どちらもプロパティとメソッドに注釈を付けることができますが、重要な違いがいくつかあります。
表示属性
- アセンブリの
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
、クラスでも使用できるようになりました。
おそらくこれは .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)