ثبت داده های Enum در DropdownList

پنجشنبه 12 آذر 1394

بعضی وقت ها به عنوان برنامه نویس نیاز داریم که اطلاعات درون یک Enum را درون یک dropdownlist قرار دهیم .دو راه برای این کار وجود دارد که در این مقاله هر دو روش توضیح داده خواهد شد و در کدی که ضمیمه این مقاله است پیاده سازی شده است .

ثبت داده های 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;
   }
}
فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید