atribut displayname vs atribut display

Jawaban:

69

Keduanya memberi Anda hasil yang sama tetapi perbedaan utama yang saya lihat adalah bahwa Anda tidak dapat menentukan atribut ResourceTypedalam DisplayName. Sebagai contoh di MVC 2, Anda harus subklas DisplayNameatribut untuk menyediakan sumber daya melalui lokalisasi. Displayatribut (baru dalam MVC3 dan .NET4) mendukung ResourceTypekelebihan beban sebagai properti "out of the box".

Spock
sumber
1
Senang mendengarnya! Akan menerapkan atribut khusus untuk memuat nilai tampilan dari file .resx, kemudian terjadi pada pertanyaan ini. Atribut tampilan adalah cara yang harus ditempuh ketika mengembangkan aplikasi yang dilokalkan.
Carl Heinrich Hancke
148

DisplayNamemengatur DisplayNamemetadata model. Sebagai contoh:

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

dan jika Anda menggunakan dalam pandangan Anda hal berikut:

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

itu akan menghasilkan:

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

Display melakukan hal yang sama, tetapi juga memungkinkan Anda untuk mengatur properti metadata lainnya seperti Nama, Deskripsi, ...

Brad Wilson memiliki posting blog yang bagus yang mencakup atribut-atribut itu.

Darin Dimitrov
sumber
1
+1 - mungkin jauh lebih bermanfaat daripada milik saya (sekarang dihapus); terlalu pagi untuk saya :)
Andras Zoltan
Saya punya masalah dengan PropertyDescriptor dan menggunakan Display (nama .. saat memanggil @ descriptor.DisplayName, itu hanya akan berfungsi menggunakan DisplayName, bukan Display (nama ..).
eaglei22
24

Saya pikir jawaban saat ini mengabaikan menyoroti perbedaan penting dan signifikan yang sebenarnya dan apa artinya untuk penggunaan yang dimaksud. Meskipun keduanya mungkin bekerja dalam situasi tertentu karena implementer mendukung keduanya, mereka memiliki skenario penggunaan yang berbeda. Keduanya dapat membuat anotasi properti dan metode tetapi berikut adalah beberapa perbedaan penting:

DisplayAttribute

  • didefinisikan dalam System.ComponentModel.DataAnnotationsnamespace di System.ComponentModel.DataAnnotations.dllmajelis
  • dapat digunakan pada parameter dan bidang
  • memungkinkan Anda mengatur properti tambahan seperti DescriptionatauShortName
  • dapat dilokalisasi dengan sumber daya

DisplayNameAttribute

  • DisplayName ada di System.ComponentModelnamespace diSystem.dll
  • dapat digunakan di kelas dan acara
  • tidak dapat dilokalisasi dengan sumber daya

Majelis dan namespace berbicara tentang penggunaan yang dimaksudkan dan dukungan pelokalan adalah penendang besar. DisplayNameAttributetelah ada sejak .NET 2 dan tampaknya telah lebih ditujukan untuk penamaan komponen pengembang dan properti dalam kisi properti warisan, tidak begitu banyak untuk hal-hal yang terlihat oleh pengguna akhir yang mungkin memerlukan lokalisasi dan semacamnya.

DisplayAttributediperkenalkan kemudian di .NET 4 dan tampaknya dirancang khusus untuk memberi label anggota kelas data yang akan terlihat oleh pengguna akhir, sehingga lebih cocok untuk DTO, entitas, dan hal-hal lain semacam itu. Saya merasa agak disayangkan bahwa mereka membatasinya sehingga tidak dapat digunakan di kelas.

EDIT: Sepertinya sumber .NET Core terbaru memungkinkan DisplayAttributeuntuk digunakan di kelas sekarang juga.

Mike Marynowski
sumber
13

Mungkin ini khusus untuk .net core, saya menemukan DisplayName tidak akan berfungsi tetapi Display (Name = ...) tidak. Ini dapat menyelamatkan orang lain dari pemecahan masalah yang terlibat :)

//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)
siang
sumber