Как получить значения перечисления в SelectList - PullRequest
65 голосов
/ 10 июля 2009

Представьте, что у меня есть перечисление, подобное этому (просто в качестве примера):

public enum Direction{
    Horizontal = 0,
    Vertical = 1,
    Diagonal = 2
}

Как мне написать подпрограмму для получения этих значений в System.Web.Mvc.SelectList, если в будущем содержимое перечисления может измениться? Я хочу получить имя каждого перечисления в качестве текста параметра и его значение в качестве текста значения, например:

<select>
    <option value="0">Horizontal</option>
    <option value="1">Vertical</option>
    <option value="2">Diagonal</option>
</select>

Это лучшее, что я могу придумать:

 public static SelectList GetDirectionSelectList()
 {
    Array values = Enum.GetValues(typeof(Direction));
    List<ListItem> items = new List<ListItem>(values.Length);

    foreach (var i in values)
    {
        items.Add(new ListItem
        {
            Text = Enum.GetName(typeof(Direction), i),
            Value = i.ToString()
        });
    }

    return new SelectList(items);
 }

Однако при этом всегда отображается текст параметра «System.Web.Mvc.ListItem». Отладка через это также показывает мне, что Enum.GetValues ​​() возвращает 'Horizontal, Vertical' и т. Д. Вместо 0, 1, как я и ожидал, что заставляет меня задуматься, в чем разница между Enum.GetName () и Enum. ПолучитьЗначение (). * * 1 010

Ответы [ 12 ]

82 голосов
/ 10 июля 2009

Прошло некоторое время с тех пор, как мне пришлось это сделать, но я думаю, что это должно сработать.

var directions = from Direction d in Enum.GetValues(typeof(Direction))
           select new { ID = (int)d, Name = d.ToString() };
return new SelectList(directions , "ID", "Name", someSelectedValue);
37 голосов
/ 09 марта 2015

Для этого есть новая функция в ASP.NET MVC 5.1.

http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum

@Html.EnumDropDownListFor(model => model.Direction)
32 голосов
/ 17 февраля 2010

Это то, что я только что сделал, и лично я считаю его сексуальным:

 public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
        {
            return (Enum.GetValues(typeof(T)).Cast<T>().Select(
                enu => new SelectListItem() { Text = enu.ToString(), Value = enu.ToString() })).ToList();
        }

Я собираюсь в конечном итоге кое-что сделать для перевода, поэтому Value = enu.ToString () будет что-то вызывать.

26 голосов
/ 10 июля 2009

Чтобы получить значение перечисления, вам нужно привести перечисление к его базовому типу:

Value = ((int)i).ToString();
21 голосов
/ 02 апреля 2013

Я хотел сделать что-то очень похожее на решение Данна, но мне нужно, чтобы значение было целым числом, а текст - строковым представлением Enum. Вот что я придумал:

public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
    {
        return (Enum.GetValues(typeof(T)).Cast<int>().Select(e => new SelectListItem() { Text = Enum.GetName(typeof(T), e), Value = e.ToString() })).ToList();
    }
7 голосов
/ 25 октября 2016

В ASP.NET Core MVC это делается с помощью помощников тегов .

<select asp-items="Html.GetEnumSelectList<Direction>()"></select>
4 голосов
/ 23 июля 2014
return
            Enum
            .GetNames(typeof(ReceptionNumberType))
            .Where(i => (ReceptionNumberType)(Enum.Parse(typeof(ReceptionNumberType), i.ToString())) < ReceptionNumberType.MCI)
            .Select(i => new
            {
                description = i,
                value = (Enum.Parse(typeof(ReceptionNumberType), i.ToString()))
            });
4 голосов
/ 27 января 2012

Или:

foreach (string item in Enum.GetNames(typeof(MyEnum)))
{
    myDropDownList.Items.Add(new ListItem(item, ((int)((MyEnum)Enum.Parse(typeof(MyEnum), item))).ToString()));
}
3 голосов
/ 16 июля 2013
    public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
        //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() };

        return new SelectList(values, "ID", "Name", enumObj);
    }
    public static SelectList ToSelectList<TEnum>(this TEnum enumObj, string selectedValue) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
        //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() };
        if (string.IsNullOrWhiteSpace(selectedValue))
        {
            return new SelectList(values, "ID", "Name", enumObj);
        }
        else
        {
            return new SelectList(values, "ID", "Name", selectedValue);
        }
    }
3 голосов
/ 21 июля 2009

возможно, не точный ответ на вопрос, но в сценариях CRUD я обычно реализую что-то вроде этого:

private void PopulateViewdata4Selectlists(ImportJob job)
{
   ViewData["Fetcher"] = from ImportFetcher d in Enum.GetValues(typeof(ImportFetcher))
                              select new SelectListItem
                              {
                                  Value = ((int)d).ToString(),
                                  Text = d.ToString(),
                                  Selected = job.Fetcher == d
                              };
}

PopulateViewdata4Selectlists вызывается перед View («Создать») и View («Редактировать»), затем и в View:

<%= Html.DropDownList("Fetcher") %>

и все ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...