我怎样才能将一个枚举转换成List <SelectListItem>?

我有一个asp.net-mvc网页,我想显示一个基于枚举的下拉列表。 我想显示每个枚举项的文本,并将该枚举值与该枚举相关联的int值。 有没有任何优雅的方式来做这个转换?

你可以使用LINQ:

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

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

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

或控制器中EnumHelper的GetSelectList方法:

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

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

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

我用静态方法做了这个,我可以重用。

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

现在我使用Tuple<string, string>但是你可以把它转换成任何东西:

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

我使用了Html Helper类中的GetEnumSelectList

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