如何获得一个枚举的值到一个SelectList

想象一下,我有这样一个枚举(就像一个例子):

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”。 通过这个debugging也显示我Enum.GetValues()正在返回'水平,垂直'等,而不是0,1,这使我想知道Enum.GetName()和枚举之间的区别是什么。的GetValue()。

要获得枚举值,需要将枚举强制转换为其基础types:

 Value = ((int)i).ToString(); 

我已经有一段时间了,但我认为这应该起作用。

 var directions = from Direction d in Enum.GetValues(typeof(Direction)) select new { ID = (int)d, Name = d.ToString() }; return new SelectList(directions , "ID", "Name", someSelectedValue); 

这就是我刚才所做的,我个人认为它很性感:

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

我将最终做一些翻译的东西,所以Value = enu.ToString()将会调用某个地方的东西。

ASP.NET MVC 5.1中有一个新特性。

http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum

 @Html.EnumDropDownListFor(model => model.Direction) 

我想做一些与Dann的解决scheme非常相似的东西,但是我需要Value是一个int,文本是Enum的string表示。 这就是我想到的:

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

也许不是一个确切的答案的问题,但在CRUD场景中,我通常实现这样的东西:

 private void PopulateViewdata4Selectlists(ImportJob job) { ViewData["Fetcher"] = from ImportFetcher d in Enum.GetValues(typeof(ImportFetcher)) select new SelectListItem { Value = ((int)d).ToString(), Text = d.ToString(), Selected = job.Fetcher == d }; } 

在View(“Create”)和View(“Edit”)之前调用PopulateViewdata4Selectlists ,然后在View:

 <%= Html.DropDownList("Fetcher") %> 

就这样..

要么:

 foreach (string item in Enum.GetNames(typeof(MyEnum))) { myDropDownList.Items.Add(new ListItem(item, ((int)((MyEnum)Enum.Parse(typeof(MyEnum), item))).ToString())); } 
 return Enum .GetNames(typeof(ReceptionNumberType)) .Where(i => (ReceptionNumberType)(Enum.Parse(typeof(ReceptionNumberType), i.ToString())) < ReceptionNumberType.MCI) .Select(i => new { description = i, value = (Enum.Parse(typeof(ReceptionNumberType), i.ToString())) }); 
  public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct { if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj"); var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() }; return new SelectList(values, "ID", "Name", enumObj); } public static SelectList ToSelectList<TEnum>(this TEnum enumObj, string selectedValue) where TEnum : struct { if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj"); var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() }; //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() }; if (string.IsNullOrWhiteSpace(selectedValue)) { return new SelectList(values, "ID", "Name", enumObj); } else { return new SelectList(values, "ID", "Name", selectedValue); } } 

在ASP.NET Core MVC中,这是通过标签助手完成的。

 <select asp-items="Html.GetEnumSelectList<Direction>()"></select> 

我有更多的类和方法出于各种原因:

枚举到收集项目

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

在Controller中创buildselect列表

 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" }) 

我有许多枚举Selectlists,经过多次狩猎和筛选后,发现使用一个通用的帮手最适合我。 它将索引或描述符作为Selectlist值返回,并将Description作为Selectlist文本返回:

枚举:

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