想象一下,我有一个这样的枚举(仅作为示例):
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”。通过这个调试也告诉我,Enum.GetValues()返回'Horizontal,Vertical'等而不是0,1,正如我所期望的那样,这让我想知道Enum.GetName()和Enum之间有什么区别。的GetValue()。
答案 0 :(得分:82)
我已经有一段时间了,但我认为这应该有用。
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);
答案 1 :(得分:37)
ASP.NET MVC 5.1中有一个新功能。
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum
@Html.EnumDropDownListFor(model => model.Direction)
答案 2 :(得分:32)
这是我刚刚制作的,我个人觉得它很性感:
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()会调用某个地方。
答案 3 :(得分:25)
要获取枚举的值,您需要将枚举转换为其基础类型:
Value = ((int)i).ToString();
答案 4 :(得分:20)
我想做一些与Dann的解决方案非常相似的东西,但是我需要将Value作为int并将文本作为Enum的字符串表示。这就是我想出的:
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();
}
答案 5 :(得分:7)
在ASP.NET Core MVC中,这是使用tag helpers完成的。
<select asp-items="Html.GetEnumSelectList<Direction>()"></select>
答案 6 :(得分:4)
或者:
foreach (string item in Enum.GetNames(typeof(MyEnum)))
{
myDropDownList.Items.Add(new ListItem(item, ((int)((MyEnum)Enum.Parse(typeof(MyEnum), item))).ToString()));
}
答案 7 :(得分:4)
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()))
});
答案 8 :(得分:3)
可能不是这个问题的确切答案,但在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
};
}
在视图(“创建”)和视图(“编辑”)之前调用 PopulateViewdata4Selectlists
,然后在视图中调用:
<%= Html.DropDownList("Fetcher") %>
这就是全部..
答案 9 :(得分:3)
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);
}
}
答案 10 :(得分:2)
由于各种原因,我有更多的课程和方法:
枚举收集项目
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中创建选择列表
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" })
答案 11 :(得分:0)
我有很多enum选择列表,经过大量的狩猎和筛选,发现制作一个通用助手对我来说效果最好。它将索引或描述符作为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);