我从Enum创建了一个下拉列表。
public enum Level
{
Beginner = 1,
Intermediate = 2,
Expert = 3
}
这是我的扩展名。
public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
{
IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
var result = from TEnum e in values
select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
var tempValue = new { ID = 0, Name = "-- Select --" };
return new SelectList(result, "Id", "Name", enumObj);
}
我遇到的问题是将antoher项插入IEnumerable。我只是想不出怎么做。有人可以修改我的代码,将“--select--”插入到顶部。
答案 0 :(得分:20)
您不能修改IEnumerable<T>
对象,它只提供枚举元素的接口。但您可以使用.ToList()
将IEnumerable<T>
转换为List<T>
。
我不确定这是不是你想要的:
public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
{
IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
var result = from TEnum e in values
select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
var tempValue = new { ID = 0, Name = "-- Select --" };
var list = result.ToList(); // Create mutable list
list.Insert(0, tempValue); // Add at beginning of list
return new SelectList(list, "Id", "Name", enumObj);
}
答案 1 :(得分:3)
您无法修改IEnumerable。顾名思义,它允许只进行前向枚举遍历。
据说这似乎是一个ASP.NET MVC应用程序。实现你想要实现的目标(插入一个默认值)的正确方法是使用DropDownFor帮助器的正确重载,如下所示:
@Html.DropDownListFor(
x => x.SomeValue,
Model.SomeEnum.ToSelectList(),
"-- Select --"
)
这显然假设您的扩展方法非常简单:
public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
{
var result =
from e in Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
select new
{
Id = (int)Enum.Parse(typeof(TEnum), e.ToString()),
Name = e.ToString()
};
return new SelectList(result, "Id", "Name", enumObj);
}
答案 2 :(得分:1)
试一试
public static SelectList ToSelectList<TEnum>( this TEnum enumObj )
{
var result = ( from TEnum e in Enum.GetValues( typeof( TEnum ) )
select new
{
ID = (int) Enum.Parse( typeof( TEnum ), e.ToString() ),
Name = e.ToString()
} ).ToList();
result.Insert( 0, new
{
ID = 0,
Name = "-- Select --"
} );
return new SelectList( result, "Id", "Name", enumObj );
}