Как я могу преобразовать перечисление в Список <SelectListItem>? - PullRequest
61 голосов
/ 16 августа 2010

У меня есть веб-страница asp.net-mvc, и я хочу показать выпадающий список, основанный на перечислении.Я хочу показать текст каждого элемента перечисления и идентификатор, являющийся значением int, с которым связано перечисление.Есть ли какой-нибудь элегантный способ сделать это преобразование?

Ответы [ 6 ]

119 голосов
/ 16 августа 2010

Вы можете использовать LINQ:

Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
    Text = v.ToString(),
    Value = ((int)v).ToString()
}).ToList();
24 голосов
/ 15 июля 2015

Начиная с MVC 5.1, самый элегантный способ - использовать EnumDropDownListFor метод Html помощника, если вам нужно заполнить select опций в вашем представлении:

@Html.EnumDropDownListFor(m => m.MyEnumProperty,new { @class="form-control"})

или GetSelectList метод EnumHelper в вашем контроллере:

var enumList = EnumHelper.GetSelectList(typeof (MyEnum));
4 голосов
/ 03 декабря 2015

Я сделал это с помощью статического метода, который я мог бы использовать повторно.

public static IEnumerable<SelectListItem> EnumToSelectList<T>()
{
    return (Enum.GetValues(typeof(T)).Cast<T>().Select(
        e => new SelectListItem() { Text = e.ToString(), Value = e.ToString() })).ToList();
}
4 голосов
/ 16 августа 2010

Вы можете использовать Enum.GetNames(), чтобы получить строковый массив, содержащий имена элементов перечисления. Если ваши названия элементов удобны для пользователя, то это, вероятно, достаточно хорошо. В противном случае вы можете создать свой собственный метод GetName(), который будет возвращать хорошее имя для каждого элемента.

ИЛИ - если перечисление никогда (или редко) не изменится, вы можете просто создать метод, который напрямую добавляет жестко закодированные элементы в выпадающий список. Это, вероятно, более эффективно (если это важно для вас).

2 голосов
/ 16 августа 2010

Теперь я использовал Tuple<string, string>, но вы можете преобразовать это, чтобы использовать что-нибудь:

var values = Enum.GetValues(typeof(DayOfWeek))
    .Cast<DayOfWeek>()
    .Select(d => Tuple.Create(((int)d).ToString(), d.ToString()))
    .ToList()
1 голос
/ 19 октября 2017

Я использовал GetEnumSelectList из класса Html Helper

<select asp-for="MyProperty" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()" ></select>
...