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


68

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


1
Maksim Vi的答案。应该确实是正确的答案。
Casey Crookston,

Answers:


132

您可以使用LINQ:

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

尽管LINQ已成为Enumerable Extensions的非正式名称,但我不禁想知道是否存在更合适的扩展。
ChaosPandion 2010年

1
它是Linq名称空间和项目的一部分,并且是IMO的正确名称。Linq也是语言扩展的名称。
Dykam,2010年

上面的代码未编译。我正在尝试这样做:List <SelectListItem> dropdown = Enum.GetValues(typeof(EventType))。Select(v => new SelectListItem {Selected =(int)v == id,Text = v.ToString(),Value =(((int)v).ToString()})。ToList(); 返回下拉列表;但出现错误:正在执行(int)v的行中出现“无法将表达式从TSource强制转换为int”
leora 2010年

您可能会说:“您可以使用System.Linq”
John Farrell 2010年

33

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

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

或控制器中EnumHelper的GetSelectList方法:

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

非常光滑!对此一无所知...应该是正确的答案。
Casey Crookston,

1
哇,我不知道。现在保存了很多代码行!谢谢你,兄弟!
奥特先生

对于那些想知道EnumHelper的人,请执行以下操作:Html.DropDownList(“ SearchEnum”,EnumHelper.GetSelectList(typeof(MyEnum)))
Garrett Banuk

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();
}

4

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

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


3

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

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

3

GetEnumSelectList从Html Helper类使用

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

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仓库的链接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.