ثبت داده های Enum در DropdownList
پنجشنبه 12 آذر 1394بعضی وقت ها به عنوان برنامه نویس نیاز داریم که اطلاعات درون یک Enum را درون یک dropdownlist قرار دهیم .دو راه برای این کار وجود دارد که در این مقاله هر دو روش توضیح داده خواهد شد و در کدی که ضمیمه این مقاله است پیاده سازی شده است .
بعضی وقت ها به عنوان برنامه نویس نیاز داریم که اطلاعات درون یک Enum را درون یک dropdownlist قرار دهیم .دو راه برای این کار وجود دارد که در این مقاله هر دو روش توضیح داده خواهد شد و در کدی که ضمیمه این مقاله است پیاده سازی شده است .
روش اول:
ابتدا به Enum که قرار است در داخل DropdownList نمایش داده شود توجه کنید .
public enum eUserRole : int { SuperAdmin = 0, PhoenixAdmin = 1, OfficeAdmin = 2, ReportUser = 3, BillingUser = 4 }
برای ایجاد یک لیستی از آیتم های Enum در داخل action کد های زیر را می نویسیم
public ActionResult Index() { var enumData = from eUserRole e in Enum.GetValues(typeof(eUserRole)) select new { ID = (int)e, Name = e.ToString() }; ViewBag.EnumList = new SelectList(enumData, "ID", "Name"); return View(); }
در داخل view مربوط به این Action هم کد زیر را وارد می کنیم
@Html.DropDownList("EnumDropDown",ViewBag.EnumList as SelectList)
اکنون با اجرای برنامه و در Url با آدرس /Home/Index برنامه اجرا شده و شکل زیر را خواهید دید
مشکلی که روش اول دارد این است که ، مجبوریم کوئری لینکی که در بالا نوشته شد را در Actionکه نیاز به ثبت داده های Enum به DropDownlist را داریم بنویسیم.
روش دوم :
در این روش از متد های الحاقی استفاده می کنیم که هر نوع Enum را برای ما تبدیل به داده هایی می کند که می توانیم در DropDownList استفاده کنیم .
متد الحاقی مورد نظر به صورت زیر است
public static class ExtensionMethods { public static System.Web.Mvc.SelectList ToSelectList<TEnum>(this TEnum obj) where TEnum : struct, IComparable, IFormattable, IConvertible { return new SelectList(Enum.GetValues(typeof(TEnum)).OfType<Enum>() .Select(x => new SelectListItem { Text = Enum.GetName(typeof(TEnum), x), Value = (Convert.ToInt32(x)).ToString() }), "Value", "Text"); } }
در داخل کنترلر home یک Action به نام approach2 می نویسیم
public ActionResult approach2() { ViewBag.EnumList = eUserRole.SuperAdmin.ToSelectList(); return View(); }
در داخل view مربوط به این Action کد های زیر را می نویسیم
@using WebApplication5.Controllers @{ ViewBag.Title = "approach2"; } <h2>approach2</h2> @Html.DropDownList("EnumDropDown", HomeController.eUserRole.SuperAdmin.ToSelectList())
بعد از اجرای این کد و رفتن به آدرس /home/Approach2 می توانیم شکل زیر را ببینیم
بعد از اینکه روش دوم هم گفته شد در اینجا متد الحاقی ToselectList را با یک پارمتر دیگر بازنویسی می کنیم
البته این متد های الحاقی در داخل کلاس ExtentionMethod تعریف شده اند برای اینکه در اجرای برنامه مشکلی پیش نیاید در هر بار اجرا به هر کدام از روش ها در داخل این کلاس متد دیگر را کامنت می کنیم تا اجرای برنامه دچار مشکل نشود
در کلاس ExtentionMethod تابع ToSelectList را بازنویسی می کنیم
public static class ExtensionMethods { public static System.Web.Mvc.SelectList ToSelectList<TEnum>(this TEnum obj,object selectedValue) where TEnum : struct, IComparable, IFormattable, IConvertible { return new SelectList(Enum.GetValues(typeof(TEnum)).OfType<Enum>() .Select(x => new SelectListItem { Text = Enum.GetName(typeof(TEnum), x), Value = (Convert.ToInt32(x)).ToString() }), "Value", "Text",selectedValue); } }
و در داخل view مربوط به صورت زیر از آن استفاده می کنیم .
Html.DropDownList("EnumDropDownWithSelected", eUserRole.SuperAdmin.ToSelectList((int)eUserRole.OfficeAdmin))
در خیلی از مواقع فقط نیاز نیست که هر چه در Enum بود در داخل DropDownList نمایش داده شود برای همین نیاز داریم که کلاسی بنویسیم که از کلاسAttribute ارث بری می کند.
این کلاس به صورت زیر است :
public class EnumDisplayNameAttribute : Attribute { private string _displayName; public string DisplayName { get { return _displayName; } set { _displayName = value; } } }
حالا می توانیم از این Attribute در داخل Enum خود استفاده کنیم
public enum eUserRole : int { [EnumDisplayName(DisplayName="Super Admin")] SuperAdmin = 0, [EnumDisplayName(DisplayName = "Phoenix Admin")] PhoenixAdmin = 1, [EnumDisplayName(DisplayName = "Office Admin")] OfficeAdmin = 2, [EnumDisplayName(DisplayName = "Report User")] ReportUser = 3, [EnumDisplayName(DisplayName = "Billing User")] BillingUser = 4 }
برای استفاده از این Enum خاص باید ExtensionMethod خود را دوباره بازنویسی کنیم
public static class ExtensionMethods { public static System.Web.Mvc.SelectList ToSelectList<TEnum>(this TEnum obj) where TEnum : struct, IComparable, IFormattable, IConvertible // correct one { return new SelectList(Enum.GetValues(typeof(TEnum)).OfType<Enum>() .Select(x => new SelectListItem { Text = x.DisplayName(), Value = (Convert.ToInt32(x)).ToString() }), "Value", "Text"); } public static string DisplayName(this Enum value) { FieldInfo field = value.GetType().GetField(value.ToString()); EnumDisplayNameAttribute attribute = Attribute.GetCustomAttribute(field, typeof(EnumDisplayNameAttribute)) as EnumDisplayNameAttribute; return attribute == null ? value.ToString() : attribute.DisplayName; } }
- ASP.net MVC
- 2k بازدید
- 6 تشکر