我正在尝试使用Html.DropDownList
扩展方法,但不知道如何将其与枚举一起使用。
假设我有一个如下所示的枚举:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
如何使用Html.DropDownList
扩展方法创建包含这些值的dropdown?
或者,我最好的办法就是简单地创建一个for循环,然后手动创建Html元素?
发布于 2009-01-11 11:48:21
我遇到了同样的问题,发现了这个问题,并认为Ash提供的解决方案不是我想要的;与内置的Html.DropDownList()
函数相比,必须自己创建HTML意味着灵活性较低。
事实证明,C#3等让这件事变得非常简单。我有一个名为TaskStatus
的enum
var statuses = from TaskStatus s in Enum.GetValues(typeof(TaskStatus))
select new { ID = s, Name = s.ToString() };
ViewData["taskStatus"] = new SelectList(statuses, "ID", "Name", task.Status);
这会创建一个很好的ol‘SelectList
,可以像在视图中一样使用:
<td><b>Status:</b></td><td><%=Html.DropDownList("taskStatus")%></td></tr>
匿名类型和LINQ使它变得更加优雅。无意冒犯,阿什。:)
发布于 2010-11-04 01:39:10
Html.DropDownListFor只需要一个IEnumerable,因此企业解决方案的替代方案如下所示。这将允许您简单地编写:
@Html.DropDownListFor(m => m.SelectedItemType, Model.SelectedItemType.ToSelectList())
其中,SelectedItemType是ItemTypes类型的模型上的字段,并且模型是非空的
而且,您实际上不需要泛化扩展方法,因为您可以使用enumValue.GetType()而不是typeof(T)。
编辑:在这里集成了西蒙的解决方案,并包含了ToDescription扩展方法。
public static class EnumExtensions
{
public static IEnumerable<SelectListItem> ToSelectList(this Enum enumValue)
{
return from Enum e in Enum.GetValues(enumValue.GetType())
select new SelectListItem
{
Selected = e.Equals(enumValue),
Text = e.ToDescription(),
Value = e.ToString()
};
}
public static string ToDescription(this Enum value)
{
var attributes = (DescriptionAttribute[])value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}
}
发布于 2010-10-27 01:13:06
因此,如果您正在寻找简单和容易的扩展函数,则不使用扩展函数。我就是这么做的
<%= Html.DropDownListFor(x => x.CurrentAddress.State, new SelectList(Enum.GetValues(typeof(XXXXX.Sites.YYYY.Models.State))))%>
其中XXXXX.Sites.YYYY.Models.State是枚举
也许做帮助器功能更好,但当时间很短时,这将完成工作。
https://stackoverflow.com/questions/388483
复制相似问题