我有一个 asp.net-mvc 网页,我想显示一个基于枚举的下拉列表。我想显示每个枚举项的文本,id 是与枚举关联的 int 值。有什么优雅的方式来进行这种转换吗?
问问题
49272 次
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"});
于 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 回答