Merhaba arkadaşlar,
Projelerimizde tanımlamış olduğumuz Enum değerlerini Viewlarımızda gösterirken name‘leri değilde, tanımlamış olduğumuz görünür adları ile listelensin isteriz.
Ancak MVC, Create sayfalarında bunu otomatik olarak yaparken, Listeleme yapılan sayfalarda maalesef otomatik olarak bunu yapamıyor.
Aşağıda ki örnek ile Enum’larımızın DisplayNamelerini nasıl gösteririz bakalım;
Benim şu şekilde tanımladığım TaxNum adlı Enumım var;
public enum TaxNum { [Display(Name = " ")] none, [Display(Name = "KDV %1")] One, [Display(Name = "KDV %8")] Eight, [Display(Name = "KDV %18")] Eighteen }
Bu Enum şöyle gözüküyor;
Burada displayName’leri göstermek için şöyle yapıyoruz.
1- Shared klasörü altında > DisplayTemplates adlı klasör açıyoruz.> Enum.cshtml PartialView‘ını oluşturuyoruz.
2- Enum.cshtml sayfasının içeriğine şu kodları yazıyoruz.
@model Enum @if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata)) { // Display Enum using same names (from [Display] attributes) as in editors string displayName = null; foreach (SelectListItem item in EnumHelper.GetSelectList(ViewData.ModelMetadata, (Enum)Model)) { if (item.Selected) { displayName = item.Text ?? item.Value; } } // Handle the unexpected case that nothing is selected if (String.IsNullOrEmpty(displayName)) { if (Model == null) { displayName = String.Empty; } else { displayName = Model.ToString(); } } @Html.DisplayTextFor(model => displayName) } else { // This Enum type is not supported. Fall back to the text. @Html.DisplayTextFor(model => model) }
Evet işlemler bu kadar 🙂 Bundan sonrasına karışmıyoruz. Hiçbir tektikleme vs yapmamıza gerek kalmadan, MVC bu klasör içine giriyor ve Enumları gezip displayNameleri var ise bunları gösteriyor yoksa Name‘lerini gösteriyor.
Bu işlem sonucunda benim yukarıda belirttiğim TaxEnum örneğime göre ekran görüntüm;
Bunu nasıl otomatik yapıyor diyenler için tam olarak emin olmamakla birlikte şunları söyleyebilirim;
View‘da foreach ile listeleme yaparken kullandığımız @Html.DisplayFor(modelItem => item.TaxNum) kodu, Shared altına açtığımız klasör(DisplayTemplates) ve Enum.cshtml dosyası ile displayFor methodunu override ediyoruz.
Yani bu methodunun(@Html.DisplayFor) kullanıldığı yerlerde Enum olan her veri tipi için DisplayTemplates klasörü altında ki Enum.cshtml PartialView‘ına geliyor, DisplayName var ise onu yazıyor yok ise Namelerini yazıyor.
Bu kaynaktan yararlandım;
https://www.codeproject.com/Articles/776908/Dealing-with-Enum-in-MVC
Belirttiğim kaynakta arkadaş, EditorFor kullanımınıda override ediyor. Editörlerde de listelerken DisplayNamelerini göstermeyi anlatıyor. Fakat siz mvc güncel sürümlerini kullanıyorsanız. Create sayfalarında bunu otomatik olarak yapmaktadır.
Teşekkürler.