2015-06-11 2 views
4

У меня есть модель представления, которая содержит enum:MVC - Изменение текста по умолчанию в раскрывающемся списке

public class PasswordChangerIndexViewModel 
{ 
    public enum DatabaseTypes 
    { 
     Main = 10, 
     Florida = 20, 
     Illinois = 30, 
     Missouri = 40, 
     NewHampshire = 50, 
     NewJersey = 60, 
     Oklahome = 70 
    }; 

    [DisplayName("Database")] 
    public DatabaseTypes DatabaseType { get; set; } 

} 

И на мой взгляд, я использую EnumDropDownListFor для создания выпадающего списка:

<div class="row"> 
    <div class="col-md-1"> 
     <div class="form-group"> 
      @Html.EnumDropDownListFor(z => z.DatabaseType, "** Select a Database **"); 
     </div> 
    </div> 
</div> 

Это работает, но мне интересно, есть ли способ изменить текст. Я хочу, чтобы New Hampshire отображался вместо NewHampshire и New Jersey вместо NewJersey. Есть ли вид DisplayName attribute или что-то, что я могу применить к моей модели просмотра, чтобы исправить это?

ответ

2

Используйте DisplayAttribute на своих членов перечислений:

public enum DatabaseTypes 
{ 
    Main = 10, 
    Florida = 20, 
    Illinois = 30, 
    Missouri = 40, 
    [Display(Name = "New Hampshire")] 
    NewHampshire = 50, 
    [Display(Name = "New Jersey")] 
    NewJersey = 60, 
    Oklahome = 70 
}; 

В общем, ваш должен одобрить использование [Display] вместо [DisplayName], так как он поддерживает локализацию.

+0

Я этого не знал! это мило. В моем ответе у нас были некоторые другие правила и функции, которые мы используем, поэтому хорошо иметь полный контроль над ним. – DLeh

1

Вы можете создать свой собственный шаблон для всплывающего списка Enum. Вот один я использую, который использует метод расширения, чтобы получить значение из атрибута, а не только имя перечисления:

Поместите это в соображениях/Shared/каталог EditorTemplates в EnumDropdown.cshtml

@model Enum 

@{ 
    var sort = (bool?)ViewData["sort"] ?? false; 
    var enumValues = new List<object>(); 
    foreach (var val in Enum.GetValues(Model.GetType())) 
    { 
     enumValues.Add(val); 
    } 
} 

@Html.DropDownListFor(m => m, 
    enumValues 
    .Select(m => 
    { 
     string enumVal = Enum.GetName(Model.GetType(), m); 
     var display = m.GetDescription() ?? enumVal; 
     return new SelectListItem() 
     { 
      Selected = (Model.ToString() == enumVal), 
      Text = display, 
      Value = enumVal 
     }; 
    }) 
    .OrderBy(x => sort ? x.Text : null) 
    ,new { @class = "form-control" }) 

Вот код для GetDescription():

public static string GetDescription(this object enumerationValue) 
    { 
     Type type = enumerationValue.GetType(); 
     if (!type.IsEnum) 
      throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue"); 

     //Tries to find a DescriptionAttribute for a potential friendly name 
     //for the enum 
     MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString()); 
     if (memberInfo != null && memberInfo.Length > 0) 
     { 
      object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 

      if (attrs != null && attrs.Length > 0) 
      { 
       //Pull out the description value 
       return ((DescriptionAttribute)attrs[0]).Description; 
      } 
     } 
     //If we have no description attribute, just return the ToString of the enum 
     return enumerationValue.ToString(); 

    } 

Пример использования ниже. Модель:

public enum MyEnum 
{ 
    [Description("The First Option1")] 
    Option1, 
    Option2 
} 
public class MyModel 
{ 
    [UIHint("EnumDropdown")] //matches EnumDropdown.cshtml 
    public MyEnum TheEnum { get; set; } 
} 

Посмотреть

@model MyModel 
@Html.EditorFor(x => x.TheEnum) 

Создаст ниспадающее меню с опциями "Первый вариант" и "option2"

+0

Это не работает для меня. Это похоже на то, что он является лишь частью более крупной программы. – Icemanind

+0

Что «не совсем работает»? я могу помочь вам сгладить это. Я отправлю код для 'GetDescription()', а также – DLeh

+0

Если вы можете публиковать 'GetDescription()' и 'enumType', это было бы замечательно – Icemanind