我有一个asp.net-mvc网页,我想显示一个基于枚举的下拉列表。我想显示每个枚举项的文本,id是与枚举关联的int值。有没有优雅的方式进行这种转换?
答案 0 :(得分:118)
您可以使用LINQ:
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
Text = v.ToString(),
Value = ((int)v).ToString()
}).ToList();
答案 1 :(得分:23)
从MVC 5.1开始,如果你需要在视图中填充select
选项,最优雅的方法是使用Html帮助器的EnumDropDownListFor方法:
@Html.EnumDropDownListFor(m => m.MyEnumProperty,new { @class="form-control"})
控制器中的或GetSelectList EnumHelper方法:
var enumList = EnumHelper.GetSelectList(typeof (MyEnum));
答案 2 :(得分:4)
您可以使用Enum.GetNames()
获取包含枚举项名称的字符串数组。如果您的项目名称是用户友好的,那么这可能已经足够了。否则,您可以创建自己的GetName()
方法,为每个项目返回一个好名称。
或者 - 如果枚举永远不会(或很少)改变,您可以创建一个直接将硬编码项添加到下拉列表的方法。这可能更有效(如果这对您很重要)。
答案 3 :(得分:4)
我使用可以重复使用的静态方法来完成此操作。
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 :(得分:2)
现在我使用Tuple<string, string>
但您可以将其转换为使用任何内容:
var values = Enum.GetValues(typeof(DayOfWeek))
.Cast<DayOfWeek>()
.Select(d => Tuple.Create(((int)d).ToString(), d.ToString()))
.ToList()
答案 5 :(得分:1)
我使用了Html Helper类中的GetEnumSelectList
<select asp-for="MyProperty" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()" ></select>
答案 6 :(得分: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"});
答案 7 :(得分: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>