У меня есть веб-страница asp.net-mvc, и я хочу показать раскрывающийся список, основанный на перечислении. Я хочу показать текст каждого элемента перечисления, а id - значение int, связанное с перечислением. Есть ли элегантный способ сделать это преобразование?
Как преобразовать перечисление в список <SelectListItem>?
Ответ 1
Вы можете использовать LINQ:
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
Text = v.ToString(),
Value = ((int)v).ToString()
}).ToList();
Ответ 2
Начиная с MVC 5.1, самым элегантным способом было бы использовать метод EnumDropDownListFor хелпера Html, если вам нужно заполнить select
параметры в вашем представлении:
@Html.EnumDropDownListFor(m => m.MyEnumProperty,new { @class="form-control"})
или GetSelectList метод EnumHelper в вашем контроллере:
var enumList = EnumHelper.GetSelectList(typeof (MyEnum));
Ответ 3
Вы можете использовать Enum.GetNames()
для получения строкового массива, содержащего имена элементов перечисления. Если ваши имена элементов удобны для пользователя, это, вероятно, достаточно хорошо. В противном случае вы можете создать свой собственный метод GetName()
, который будет возвращать приятное имя для каждого элемента.
ИЛИ - если переименование никогда (или редко) не изменится, вы можете просто создать метод, который напрямую добавляет жестко закодированные элементы в раскрывающийся список. Это, вероятно, более эффективно (если это важно для вас).
Ответ 4
Я сделал это, используя статический метод, который я мог бы повторно использовать.
public static IEnumerable<SelectListItem> EnumToSelectList<T>()
{
return (Enum.GetValues(typeof(T)).Cast<T>().Select(
e => new SelectListItem() { Text = e.ToString(), Value = e.ToString() })).ToList();
}
Ответ 5
Теперь я использовал Tuple<string, string>
, но вы можете преобразовать его, чтобы использовать что-либо:
var values = Enum.GetValues(typeof(DayOfWeek))
.Cast<DayOfWeek>()
.Select(d => Tuple.Create(((int)d).ToString(), d.ToString()))
.ToList()
Ответ 6
Я использовал GetEnumSelectList
из класса Html Helper
<select asp-for="MyProperty" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()" ></select>