142

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

4

4 に答える 4

154

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

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

ビューで次を使用する場合:

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

それは生成します:

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

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

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

于 2011-03-09T09:30:40.807 に答える
74

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

于 2011-05-24T12:27:14.173 に答える
32

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

表示属性

  • アセンブリの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、クラスでも使用できるようになりました。

于 2016-08-12T14:01:19.017 に答える
15

おそらくこれは .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)
于 2016-12-08T01:13:05.863 に答える