Как получить значения перечисления в 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 ]

2 голосов
/ 18 июля 2015

У меня есть больше классов и методов по разным причинам:

Перечисление в коллекцию предметов

public static class EnumHelper
{
    public static List<ItemDto> EnumToCollection<T>()
    {
        return (Enum.GetValues(typeof(T)).Cast<int>().Select(
            e => new ItemViewModel
                     {
                         IntKey = e,
                         Value = Enum.GetName(typeof(T), e)
                     })).ToList();
    }
}

Создание списка выбора в контроллере

int selectedValue = 1; // resolved from anywhere
ViewBag.Currency = new SelectList(EnumHelper.EnumToCollection<Currency>(), "Key", "Value", selectedValue);

MyView.cshtml

@Html.DropDownListFor(x => x.Currency, null, htmlAttributes: new { @class = "form-control" })
1 голос
/ 07 апреля 2017

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

Enum:

public enum Your_Enum
{
    [Description("Description 1")]
    item_one,
    [Description("Description 2")]
    item_two
}

Помощник:

public static class Selectlists
{
    public static SelectList EnumSelectlist<TEnum>(bool indexed = false) where TEnum : struct
    {
        return new SelectList(Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(item => new SelectListItem
        {
            Text = GetEnumDescription(item as Enum),
            Value = indexed ? Convert.ToInt32(item).ToString() : item.ToString()
        }).ToList(), "Value", "Text");
    }

    // NOTE: returns Descriptor if there is no Description
    private static string GetEnumDescription(Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
        if (attributes != null && attributes.Length > 0)
            return attributes[0].Description;
        else
            return value.ToString();
    }
}

Использование: Установите для параметра значение true для индексов в качестве значения:

var descriptorsAsValue = Selectlists.EnumSelectlist<Your_Enum>();
var indicesAsValue = Selectlists.EnumSelectlist<Your_Enum>(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...