69

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

4

8 回答 8

140

您可以使用 LINQ:

Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
    Text = v.ToString(),
    Value = ((int)v).ToString()
}).ToList();
于 2010-08-15T22:05:30.143 回答
36

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

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

或控制器中 EnumHelper 的GetSelectList方法:

var enumList = EnumHelper.GetSelectList(typeof (MyEnum));
于 2015-07-15T19:42:13.423 回答
8

我使用可以重用的静态方法来做到这一点。

public static IEnumerable<SelectListItem> EnumToSelectList<T>()
{
    return (Enum.GetValues(typeof(T)).Cast<T>().Select(
        e => new SelectListItem() { Text = e.ToString(), Value = e.ToString() })).ToList();
}
于 2015-12-03T12:27:16.230 回答
5

GetEnumSelectList从 Html Helper 类中使用

<select asp-for="MyProperty" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()" ></select>
于 2017-10-19T12:47:32.893 回答
4

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

var values = Enum.GetValues(typeof(DayOfWeek))
    .Cast<DayOfWeek>()
    .Select(d => Tuple.Create(((int)d).ToString(), d.ToString()))
    .ToList()
于 2010-08-15T22:04:50.350 回答
4

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

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

于 2010-08-15T22:05:20.567 回答
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"});

这是 github 存储库的链接。

于 2019-12-29T14:35:14.347 回答
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>
于 2021-05-20T02:18:14.013 回答