Saya mencoba menggunakan Html.DropDownList
metode ekstensi tetapi tidak tahu cara menggunakannya dengan enumerasi.
Katakanlah saya memiliki penghitungan seperti ini:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
Bagaimana cara saya membuat dropdown dengan nilai-nilai ini menggunakan Html.DropDownList
metode ekstensi?
Atau apakah taruhan terbaik saya adalah dengan membuat for for dan membuat elemen Html secara manual?
c#
asp.net
asp.net-mvc
Kevin Pang
sumber
sumber
ASP.NET MVC
ada cara asli: stackoverflow.com/a/22295360/1361084Saya tahu saya terlambat ke pesta tentang hal ini, tetapi saya pikir Anda mungkin menemukan varian ini berguna, karena yang ini juga memungkinkan Anda untuk menggunakan string deskriptif daripada konstanta enumerasi dalam drop down. Untuk melakukan ini, hiasi setiap entri enumerasi dengan atribut [System.ComponentModel.Description].
Sebagai contoh:
Ini kode saya:
Anda kemudian dapat melakukan ini dalam pandangan Anda:
Semoga ini bisa membantu Anda!
** EDIT 2014-JAN-23: Microsoft baru saja merilis MVC 5.1, yang sekarang memiliki fitur EnumDropDownListFor. Sayangnya itu tampaknya tidak menghormati atribut [Deskripsi] sehingga kode di atas masih berdiri. Lihat bagian Enum di catatan rilis Microsoft untuk MVC 5.1.
Pembaruan: Itu memang mendukung atribut Display
[Display(Name = "Sample")]
, jadi orang dapat menggunakannya.[Perbarui - perhatikan saja ini, dan kode ini terlihat seperti versi kode yang diperluas di sini: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , dengan beberapa tambahan. Jika demikian, atribusi akan tampak adil ;-)]
sumber
System.Web.Mvc.Html
maka dikatakan ituDropDownListFor
tidak dapat ditemukan, tetapi juga tidak bisa menyelesaikannya. Anda harus melakukannya secara manualusing System.Web.Mvc.Html;
. Asal tahu saja.Di ASP.NET MVC 5.1 , mereka menambahkan
EnumDropDownListFor()
helper, jadi tidak perlu untuk ekstensi khusus:Model :
Lihat :
Menggunakan Tag Helper (ASP.NET MVC 6) :
sumber
Saya bertemu dengan masalah yang sama, menemukan pertanyaan ini, dan berpikir bahwa solusi yang diberikan oleh Ash bukan yang saya cari; Harus membuat HTML sendiri berarti kurang fleksibel dibandingkan dengan
Html.DropDownList()
fungsi bawaan.Ternyata C # 3 dll membuat ini sangat mudah. Saya telah sebuah
enum
disebutTaskStatus
:Ini menghasilkan ol yang bagus
SelectList
yang bisa digunakan seperti yang biasa Anda lihat:Tipe anonim dan LINQ membuat IMHO ini jauh lebih elegan. Tidak ada pelanggaran yang dimaksudkan, Ash. :)
sumber
select new { ID = (int)s, Name = s.ToString() };
Berikut ini adalah solusi enkapsulasi yang lebih baik:
https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5
Katakan di sini adalah model Anda:
Penggunaan sampel:
UI yang dihasilkan:
Dan menghasilkan HTML
Snapshot Kode Sumber Ekstensi Pembantu:
Anda dapat mengunduh proyek sampel dari tautan yang saya berikan.
EDIT: Inilah kodenya:
sumber
Html.DropDownListFor hanya membutuhkan IEnumerable, jadi alternatif untuk solusi Prise adalah sebagai berikut. Ini memungkinkan Anda untuk menulis:
[Di mana SelectedItemType adalah bidang pada model ItemTypes jenis Anda, dan model Anda bukan nol]
Selain itu, Anda tidak perlu membuat generik metode ekstensi karena Anda dapat menggunakan enumValue.GetType () daripada typeof (T).
EDIT: Solusi Simon terintegrasi di sini juga, dan termasuk metode ekstensi ToDescription.
sumber
Jadi tanpa fungsi Extension jika Anda mencari yang sederhana dan mudah .. Inilah yang saya lakukan
di mana XXXXX.Sites.YYYY.Models.State adalah enum
Mungkin lebih baik melakukan fungsi helper, tetapi ketika waktu singkat ini akan menyelesaikan pekerjaan.
sumber
Memperluas jawaban Hadiah dan Rune, jika Anda ingin memiliki atribut nilai peta item daftar pilih Anda ke nilai integer dari tipe Enumerasi, daripada nilai string, gunakan kode berikut:
Alih-alih memperlakukan setiap nilai Enumerasi sebagai objek TEnum, kita bisa memperlakukannya sebagai objek lalu melemparkannya ke integer untuk mendapatkan nilai yang tidak dikotak.
Catatan: Saya juga menambahkan batasan tipe generik untuk membatasi tipe yang ekstensi ini hanya tersedia untuk struct (tipe dasar Enum), dan validasi tipe run-time yang memastikan bahwa struct yang dilewati memang merupakan Enum.
Pembaruan 10/23/12: Menambahkan parameter tipe umum untuk tipe dasar dan memperbaiki masalah non-kompilasi yang mempengaruhi .NET 4+.
sumber
ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
Value = Convert.ToInt32(e)
.(int)e
tidak dikompilasi. :(Untuk mengatasi masalah mendapatkan nomor alih-alih teks menggunakan metode ekstensi Prise.
sumber
e
keint
.ID = Convert.ToInt32(e)
.Cara super mudah untuk menyelesaikan ini - tanpa semua ekstensi yang tampaknya berlebihan adalah ini:
Enum Anda:
Di dalam pengontrol Anda mengikat Enum ke Daftar:
Setelah itu buang ke dalam ViewBag:
Akhirnya cukup ikat ke View:
Sejauh ini, ini adalah cara termudah yang saya temukan dan tidak memerlukan ekstensi atau apapun yang gila.
UPDATE : Lihat komentar Andrews di bawah ini.
sumber
Level1 = 1
, maka nilai dropdown akan menjadi"Level1"
bukan1
.Solusi terbaik yang saya temukan untuk ini adalah menggabungkan blog ini dengan jawaban Simon Goldstone .
Ini memungkinkan penggunaan enum dalam model. Intinya idenya adalah menggunakan properti integer serta enum, dan meniru properti integer.
Kemudian gunakan atribut [System.ComponentModel.Description] untuk membubuhi keterangan model dengan teks tampilan Anda, dan gunakan ekstensi "EnumDropDownListFor" di tampilan Anda.
Ini membuat tampilan dan model sangat mudah dibaca dan dipelihara.
Model:
Melihat:
Ekstensi (langsung dari jawaban Simon Goldstone , termasuk di sini untuk kelengkapan):
sumber
Anda ingin melihat menggunakan sesuatu seperti
Enum.GetValues
sumber
sumber
Ini adalah jawaban Rune & Hadiah yang diubah untuk menggunakan nilai Enum
int
sebagai ID.Sampel Enum:
Metode ekstensi:
Contoh penggunaan:
Ingatlah untuk Mengimpor namespace yang berisi metode Extension
Contoh HTML yang dihasilkan:
Perhatikan bahwa item yang Anda gunakan untuk memanggil
ToSelectList
adalah item yang dipilih.sumber
Id = Convert.ToInt32(e)
.Ini adalah versi untuk Razor:
sumber
Di .NET Core Anda bisa menggunakan ini:
sumber
<select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
.Sekarang fitur ini didukung di luar kotak di MVC 5.1 hingga
@Html.EnumDropDownListFor()
Periksa tautan berikut:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum
Sangat memalukan bahwa Microsoft membutuhkan waktu 5 tahun untuk mengimplementasikan fitur seperti yang sangat diminati menurut pemungutan suara di atas!
sumber
Membangun pada jawaban Simon, pendekatan yang sama adalah untuk mendapatkan nilai-nilai Enum untuk ditampilkan dari file Sumber Daya, bukan dalam atribut deskripsi dalam Enum itu sendiri. Ini bermanfaat jika situs Anda perlu diterjemahkan dalam lebih dari satu bahasa dan jika Anda memiliki file sumber daya spesifik untuk Enums, Anda dapat melangkah lebih jauh dan hanya memiliki nilai Enum, di Enum Anda dan merujuknya dari ekstensi dengan sebuah konvensi seperti [EnumName] _ [EnumValue] - akhirnya kurang mengetik!
Ekstensi tersebut kemudian terlihat seperti:
Sumber daya dalam file Enums.Resx tampak seperti ItemTypes_Movie: Film
Satu hal lain yang ingin saya lakukan adalah, daripada memanggil metode ekstensi secara langsung, saya lebih suka menyebutnya dengan @ Html.EditorFor (x => x.MyProperty), atau idealnya hanya memiliki seluruh bentuk, dalam satu @ rapi Html.EditorForModel (). Untuk melakukan ini, saya mengubah templat string menjadi seperti ini
Jika ini menarik minat Anda, saya telah memberikan jawaban yang jauh lebih rinci di blog saya:
http://paulthecyclist.com/2013/05/24/enum-dropdown/
sumber
Yah saya benar-benar terlambat ke pesta, tetapi untuk apa nilainya, saya telah membuat blog tentang subjek ini di mana saya membuat
EnumHelper
kelas yang memungkinkan transformasi yang sangat mudah.http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23
Di controller Anda:
Menurut Anda:
Kelas pembantu:
sumber
Saya sangat terlambat dalam hal ini, tetapi saya baru saja menemukan cara yang sangat keren untuk melakukan ini dengan satu baris kode, jika Anda senang menambahkan paket Melody NuGet yang tidak dibatasi (perpustakaan kecil yang bagus dari Jon Skeet).
Solusi ini lebih baik karena:
Jadi, inilah langkah-langkah untuk membuatnya bekerja:
Tambahkan properti pada model Anda seperti ini:
Sekarang Anda memiliki Daftar SelectListItem terbuka pada model Anda, Anda dapat menggunakan @ Html.DropDownList atau @ Html.DropDownListFor menggunakan properti ini sebagai sumber.
sumber
Perbaikan lain untuk metode ekstensi ini - versi saat ini tidak memilih nilai enum saat ini. Saya memperbaiki baris terakhir:
sumber
Jika Anda ingin menambahkan dukungan lokalisasi, ubah saja metode s.toString () menjadi seperti ini:
Di sini typeof (Sumber) adalah sumber yang ingin Anda muat, dan kemudian Anda mendapatkan String yang dilokalkan, juga berguna jika enumerator Anda memiliki nilai dengan banyak kata.
sumber
Ini adalah versi metode penolong saya. Saya menggunakan ini:
Alih-alih itu:
Ini dia:
sumber
Anda juga dapat menggunakan HtmlHelpers khusus saya di Griffin.MvcContrib. Kode berikut:
Menghasilkan:
https://github.com/jgauffin/griffin.mvccontrib
sumber
Saya ingin menjawab pertanyaan ini dengan cara yang berbeda di mana, pengguna tidak perlu melakukan apa pun di dalam
controller
atauLinq
ekspresi. Cara ini...Saya punya
ENUM
Sekarang saya hanya bisa membuat
dropdown
dengan menggunakan inienum
.ATAU
Jika Anda ingin membuat indeks dipilih maka coba ini
Di sini saya telah menggunakan
AccessLevelEnum.NoAccess
sebagai parameter tambahan untuk memilih dropdown secara default.sumber
Saya menemukan jawaban di sini . Namun, beberapa enum saya memiliki
[Description(...)]
atribut, jadi saya telah memodifikasi kode untuk memberikan dukungan untuk itu:Semoga itu bisa membantu.
sumber
@Simon Goldstone: Terima kasih atas solusi Anda, ini dapat diterapkan dengan sempurna dalam kasus saya. Satu-satunya masalah adalah saya harus menerjemahkannya ke VB. Tapi sekarang sudah selesai dan untuk menghemat waktu orang lain (jika mereka membutuhkannya) saya taruh di sini:
End Anda menggunakannya seperti ini:
sumber
Saya akhirnya menciptakan metode ekstensi untuk melakukan apa yang pada dasarnya adalah jawaban terima di sini. Setengah terakhir dari Gist berkaitan dengan Enum secara khusus.
https://gist.github.com/3813767
sumber
sumber
sumber