web-dev-qa-db-ja.com

表示名属性と表示属性

ASP.NET MVCのDisplayName属性とDisplay属性の違いは何ですか?

119
Ghooti Farangi

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

67
Spock

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 があります。

137
Darin Dimitrov

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

DisplayAttribute

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

DisplayNameAttribute

  • DisplayNameはSystem.ComponentModelSystem.dll名前空間にあります
  • クラスおよびイベントで使用できます
  • リソースでローカライズできない

アセンブリと名前空間は意図された使用法に対応しており、ローカライズのサポートが重要です。 DisplayNameAttributeは.NET 2以降登場しており、開発者コンポーネントやレガシープロパティグリッド内のプロパティの命名を目的としており、ローカライズなどが必要なエンドユーザーに見えるものにはあまり向いていません。

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

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

17
Mike Marynowski

おそらくこれは.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)
10
mattpm