如何将枚举转换为List <selectlistitem>?</selectlistitem>

时间:2010-08-15 21:59:40

标签: c# asp.net-mvc enums selectlistitem

我有一个asp.net-mvc网页,我想显示一个基于枚举的下拉列表。我想显示每个枚举项的文本,id是与枚举关联的int值。有没有优雅的方式进行这种转换?

8 个答案:

答案 0 :(得分:118)

您可以使用LINQ:

Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
    Text = v.ToString(),
    Value = ((int)v).ToString()
}).ToList();

答案 1 :(得分:23)

从MVC 5.1开始,如果你需要在视图中填充select选项,最优雅的方法是使用Html帮助器的EnumDropDownListFor方法:

@Html.EnumDropDownListFor(m => m.MyEnumProperty,new { @class="form-control"})
控制器中的

GetSelectList EnumHelper方法:

var enumList = EnumHelper.GetSelectList(typeof (MyEnum));

答案 2 :(得分:4)

您可以使用Enum.GetNames()获取包含枚举项名称的字符串数组。如果您的项目名称是用户友好的,那么这可能已经足够了。否则,您可以创建自己的GetName()方法,为每个项目返回一个好名称。

或者 - 如果枚举永远不会(或很少)改变,您可以创建一个直接将硬编码项添加到下拉列表的方法。这可能更有效(如果这对您很重要)。

答案 3 :(得分: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();
}

答案 4 :(得分:2)

现在我使用Tuple<string, string>但您可以将其转换为使用任何内容:

var values = Enum.GetValues(typeof(DayOfWeek))
    .Cast<DayOfWeek>()
    .Select(d => Tuple.Create(((int)d).ToString(), d.ToString()))
    .ToList()

答案 5 :(得分:1)

我使用了Html Helper类中的GetEnumSelectList

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

答案 6 :(得分:0)

使用我的扩展方法超级简单。这还允许您提供诸如添加占位符,分组和禁用某些值或组之类的选项。试试看。

enum Color
{       
    Blue,
    [Category("Light")]
    [DisplayName("Light Blue")]
    LBlue,
    [Category("Dark")]
    [DisplayName("Dark Blue")]
    DBlue,
    Red,
    [Category("Dark")]
    [DisplayName("Dark Red")]
    DRed,
    [Category("Light")]
    [DisplayName("Light Red")]
    LRed,
    Green,
    [Category("Dark")]
    [DisplayName("Dark Green")]
    DGreen,
    [Category("Light")]
    [DisplayName("Light Green")]
    LGreen  
}

var list = typeof(Color).ToSelectList();

//or with custom options
var list = typeof(Color).ToSelectList(new SelectListOptions { Placeholder = "Please Select A Color"});

Here's the link to the github repo.

答案 7 :(得分:0)

在 Asp.Net Core 中,只需使用:

<select asp-for="MyEnum" asp-items="Html.GetEnumSelectList(typeof(MyEnum))"></select>

创建助手

public static class EnumHelper
{
    public static IEnumerable<SelectListItem> GetEnumSelectList<TEnum>(bool isNullable = false)
        where TEnum : struct
    {
        IList<SelectListItem> selectLists = Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(c => new SelectListItem()
        {
            Text = GetDisplayName(c),
            Value = c.ToString()
        }).ToList();

        if (isNullable)
        {
            selectLists.Add(new SelectListItem());
        }

        return selectLists.OrderBy(c => c.Value);
    }

    public static string GetDisplayName<TEnum>(TEnum enumVal)
    {
        DisplayAttribute attr = GetAttribute<DisplayAttribute>(enumVal);

        if (attr != null)
        {
            return attr.Name;
        }

        return enumVal?.ToString() ?? string.Empty;
    }

    public static TEnum GetAttribute<TEnum>(object enumVal) where TEnum : Attribute
    {
        if (enumVal == null)
        {
            return default;
        }

        Type type = enumVal.GetType();
        MemberInfo[] memInfo = type.GetMember(enumVal.ToString());

        if (memInfo.Length == 0)
        {
            return null;
        }

        object[] attributes = memInfo[0].GetCustomAttributes(typeof(TEnum), false);
        return attributes.Length > 0 ? (TEnum)attributes[0] : null;
    }
}

使用

@using MyClass.Helpers;
    
<select asp-for="MyEnum" asp-items="EnumHelper.GetEnumSelectList<MyEnum>(true)">/select>