2015-07-20 2 views
4

У меня есть Enum с дисплеем Описание атрибута,MVC EnumDropDownListFor с Enum Дисплей Описание атрибута в качестве значения

public enum CSSColours 
    { 
     [Display(Description = "bg-green")] 
     Green, 

     [Display(Description = "bg-blue")] 
     Blue, 
    } 

Теперь я хочу, чтобы связать этот Enum к DropDownList, показывая значение Enum (зеленый, синий) в текст отображения раскрывающегося списка и описание как элемент Значение (bg-green, bg-blue).

Когда я связать выпадающие EnumDropDownListFor вспомогательного метод

@Html.EnumDropDownListFor(c => dm.BgColor) 

Он устанавливает значение элемента на значение Enum (0, 1), и не может найти способ, чтобы установить значение для отображения Описания.

Как установить значение для атрибута атрибута Enum Display Description?

+0

это обсуждается http://stackoverflow.com/questions/13099834/how-to-get-the-display-name-attribute-of-an-enum-member-via -mvc-бритвенный код – cutit

ответ

6

Вы должны получить отображаемое имя (DisplayAttribute) от Enum, Проверьте ниже примера, чтобы установить значение Enum Дисплей Описание атрибута

Действие (связывание DropDownList)

public ActionResult Index() 
     { 
      var enumDataColours = from CSSColours e in Enum.GetValues(typeof(CSSColours)) 
          select new 
          { 
           ID = StaticHelper.GetDescriptionOfEnum((CSSColours)e), 
           Name = e.ToString() 
          }; 
      ViewBag.EnumColoursList = new SelectList(enumDataColours, "ID", "Name"); 
      return View(); 
     } 

метод Helper GetDescriptionOfEnum, чтобы получить Описание атрибута по имени перечислений

public static class StaticHelper 
    { 
     public static string GetDescriptionOfEnum(Enum value) 
     { 
      var type = value.GetType(); 
      if (!type.IsEnum) throw new ArgumentException(String.Format("Type '{0}' is not Enum", type)); 

      var members = type.GetMember(value.ToString()); 
      if (members.Length == 0) throw new ArgumentException(String.Format("Member '{0}' not found in type '{1}'", value, type.Name)); 

      var member = members[0]; 
      var attributes = member.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false); 
      if (attributes.Length == 0) throw new ArgumentException(String.Format("'{0}.{1}' doesn't have DisplayAttribute", type.Name, value)); 

      var attribute = (System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]; 
      return attribute.Description; 
     } 
    } 

вид Razor

@Html.DropDownList("EnumDropDownColours", ViewBag.EnumColoursList as SelectList) 

Enum

public enum CSSColours 
    { 
     [Display(Description = "bg-green")] 
     Green, 

     [Display(Description = "bg-blue")] 
     Blue, 
    } 
+0

Единственное, что я должен изменить в этом ответе, - это изменить DropDownList на DropDownListДля этого: '@ Html.DropDownListFor (m => m.CSSColour, ViewBag.CSSColours as SelectList, "Select Один")' – Gwasshoppa

Смежные вопросы