Saya mendapatkan properti dalam model saya yang disebut "Promosi" yang tipenya adalah flag enum yang disebut "UserPromotion". Anggota enum saya memiliki atribut tampilan yang ditetapkan sebagai berikut:
[Flags]
public enum UserPromotion
{
None = 0x0,
[Display(Name = "Send Job Offers By Mail")]
SendJobOffersByMail = 0x1,
[Display(Name = "Send Job Offers By Sms")]
SendJobOffersBySms = 0x2,
[Display(Name = "Send Other Stuff By Sms")]
SendPromotionalBySms = 0x4,
[Display(Name = "Send Other Stuff By Mail")]
SendPromotionalByMail = 0x8
}
Sekarang saya ingin dapat membuat say ul dalam pandangan saya untuk menunjukkan nilai yang dipilih dari properti "Promosi" saya. Inilah yang telah saya lakukan sejauh ini tetapi masalahnya adalah bagaimana saya bisa mendapatkan nama tampilan di sini?
<ul>
@foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
{
var currentPromotion = (int)Model.JobSeeker.Promotion;
if ((currentPromotion & aPromotion) == aPromotion)
{
<li>Here I don't know how to get the display attribute of "currentPromotion".</li>
}
}
</ul>
c#
asp.net-mvc
razor
displayattribute
Pejman
sumber
sumber
System.ComponentModel.DataAnnotations.DisplayAttribute
. TidakSystem.ComponentModel.DisplayNameAttribute
.Jawaban:
MEMPERBARUI
Solusi pertama difokuskan pada mendapatkan nama tampilan dari enum. Kode di bawah ini harus menjadi solusi tepat untuk masalah Anda.
Anda bisa menggunakan kelas penolong ini untuk enum:
Dan kemudian Anda dapat menggunakannya dalam tampilan Anda sebagai berikut:
Semoga ini bisa membantu! :)
sumber
.ToString
, tetapi dari stackoverflow.com/q/483794/179311 , ia mengatakan untuk menggunakannyaEnum.GetName
sebagai gantinya.GetDisplayValue
Anda harus tes pertamadescriptionAttributes == null
sebelum Anda mencoba untuk mengakses array:descriptionAttributes[0]
. Kalau tidak, Anda dapat mengajukan pengecualian dan baris di bawah tempat Anda memeriksa null tidak akan pernah benar.One liner - Sintaks fasih
Contoh
Keluaran
sumber
.NET Framework 4.5
dan bahwa Anda termasuk ruang nama berikutSystem.Net
System.ComponentModel.DataAnnotations
GetAttribute<TAttribute>
konvensi penamaan yang mengerikan? Itu mengambil atribut yang Anda tentukan dan menggunakan casing pascal seperti semua metode publik seharusnya.Membangun jawaban Aydin yang luar biasa , inilah metode ekstensi yang tidak memerlukan parameter tipe apa pun.
CATATAN: GetName () harus digunakan sebagai ganti properti Name. Ini memastikan bahwa string yang dilokalkan akan dikembalikan jika menggunakan properti atribut ResourceType.
Contoh
Untuk menggunakannya, cukup referensi nilai enum di tampilan Anda.
Keluaran
Promosi: Kirim Penawaran Pekerjaan Melalui Surat
sumber
@Html.DisplayFor(m => m.myEnum.GetDisplayName())
, yang tidak akan berfungsi, karena mereka mengharapkan ekspresi yang dievaluasi menghasilkan sebuah properti atau sesuatu yang serupa. Anda harus menggunakan nilai bare enum seperti pada contoh di atas.GetCustomAttribute<DisplayAttribute>()
karena untuk beberapa Enums mungkin ini tidak ada. Itu kembali keenumValue.ToString()
jika DisplayAttribute tidak ada.List<SelectListItem>
yang diisi oleh Enum dengan semuaDisplayAttribute.Name
anotasi individu - ini bekerja dengan baik, terima kasih !!public List<SelectListItem> MySelectListItem = new List<SelectListItem>(); foreach (MyEnum MyEnum in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Where(x => x != MyEnum.Default)) { MySelectListItem.Add(new SelectListItem() { Text = MyEnum.GetDisplayName(), Value = ((int)MyEnum).ToString() }); }
Berdasarkan jawaban Aydin saya akan menyarankan implementasi yang kurang "duplikat" (karena kita bisa dengan mudah mendapatkan
Type
dariEnum
nilai itu sendiri, daripada memberikannya sebagai parameter 😉:EDIT (berdasarkan komentar @Vahagn Nahapetyan)
Sekarang kita dapat menggunakannya dengan sangat bersih dengan cara ini:
Yang mengakibatkan
sumber
this
harus nilai Enum yang valid (bukan nol). Kalau tidak memanggil metode akan sudah melempar (yang merupakan tanggung jawab kode panggilan). Ini membuat yangGetType()
pasti akan memberikan Jenis Enum yang benar di manaenumvalue
pasti akan menjadi anggota. Tetapi GetCustomAttribute mungkin mengembalikan nilai nol jadi saya memberikan versi metode yang tidak biasa untuk mengembalikan nol ketika rantai panggilan metode memiliki nilai balik nol di suatu tempat. Terima kasih!Jika Anda menggunakan MVC 5.1 atau lebih tinggi, ada cara yang lebih sederhana dan lebih jelas: cukup gunakan anotasi data (dari
System.ComponentModel.DataAnnotations
namespace) seperti di bawah ini:Dan dalam pandangan, masukkan saja ke dalam bantuan html yang tepat:
sumber
Anda bisa menggunakan Metode Type.GetMember , lalu dapatkan info atribut menggunakan refleksi:
Ada beberapa posting serupa di sini:
Mendapatkan atribut nilai Enum
Bagaimana cara membuat MVC3 DisplayFor menunjukkan nilai atribut-tampilan Enum?
sumber
Membangun di atas jawaban hebat Todd yang dibangun di atas jawaban hebat Aydin , inilah metode ekstensi generik yang tidak memerlukan parameter tipe apa pun.
Saya membutuhkan ini untuk proyek saya karena sesuatu seperti kode di bawah ini, di mana tidak setiap anggota enum memiliki
DisplayAttribute
, tidak bekerja dengan solusi Todd:Jika ini adalah solusi rumit untuk masalah sederhana, harap beri tahu saya, tetapi ini adalah perbaikan yang saya gunakan.
sumber
sumber
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Saya punya dua solusi untuk Pertanyaan ini.
sumber
Untuk ASP.Net Core 3.0, ini bekerja untuk saya (kredit untuk penjawab sebelumnya).
Kelas Enum saya:
Kelas Model Tampilan Saya:
Contoh tampilan pisau cukur yang menampilkan label dan daftar drop-down. Perhatikan bahwa daftar drop-down tidak memerlukan metode pembantu:
sumber
Anda perlu menggunakan sedikit refleksi untuk mengakses atribut itu:
Saya sarankan membungkus metode ini dalam metode ekstensi atau melakukan ini dalam model tampilan.
sumber
Dengan Core 2.1,
sumber
menggabungkan semua kasus tepi bersama-sama dari atas:
Equals
,ToString
)Display
atribut opsionalini kode saya:
sumber
Saya minta maaf untuk melakukan ini, tetapi saya tidak bisa menggunakan salah satu dari jawaban lain apa adanya dan tidak punya waktu untuk menyelesaikannya di komentar.
Menggunakan sintaks C # 6.
sumber
Membangun lebih jauh jawaban Aydin dan Todd, berikut adalah metode ekstensi yang juga memungkinkan Anda mendapatkan nama dari file sumber daya
dan menggunakannya seperti
sumber
Saya ingin berkontribusi dengan ekstensi enum GetDisplayName yang bergantung pada budaya. Semoga ini bermanfaat bagi siapa pun yang menelusuri jawaban ini seperti saya sebelumnya:
"standar" seperti yang disebutkan oleh Aydin Adn dan Todd :
Cara "tergantung budaya":
sumber
Pembaruan 2020: Versi terbaru dari fungsi yang disediakan oleh banyak orang di utas ini tetapi sekarang untuk C # 7.3 dan seterusnya:
Sekarang Anda dapat membatasi metode generik ke enum jenis sehingga Anda dapat menulis ekstensi metode tunggal untuk menggunakannya dengan semua enum Anda seperti ini:
Metode ekstensi umum:
Enum:
Bagaimana cara menggunakannya:
Bonus, Enum dengan Bendera: Jika Anda berurusan dengan enum normal, fungsi di atas sudah cukup, tetapi jika salah satu enum Anda dapat mengambil beberapa nilai dengan menggunakan bendera maka Anda harus memodifikasinya seperti ini (Kode ini menggunakan C # 8 fitur):
Enum dengan bendera:
Bagaimana cara menggunakannya:
sumber
Berdasarkan jawaban sebelumnya saya telah membuat penolong yang nyaman ini untuk mendukung semua properti DisplayAttribute dengan cara yang dapat dibaca:
sumber
Saya mencoba melakukan ini sebagai suntingan tetapi ditolak; Saya tidak mengerti mengapa.
Di atas akan mengeluarkan pengecualian jika Anda menyebutnya dengan Enum yang memiliki campuran atribut khusus dan item biasa, mis
Jadi saya telah memodifikasi kode sedikit untuk memeriksa atribut khusus sebelum mencoba mengaksesnya, dan menggunakan namanya jika tidak ada yang ditemukan.
sumber
Menggunakan MVC5 Anda bisa menggunakan:
maka jika Anda ingin membuat pemilih dropdown Anda dapat menggunakan:
sumber