首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中从枚举创建下拉列表?

如何在ASP.NET MVC中从枚举创建下拉列表?
EN

Stack Overflow用户
提问于 2008-12-23 09:25:43
回答 26查看 411.1K关注 0票数 718

我正在尝试使用Html.DropDownList扩展方法,但不知道如何将其与枚举一起使用。

假设我有一个如下所示的枚举:

public enum ItemTypes
{
    Movie = 1,
    Game = 2,
    Book = 3
}

如何使用Html.DropDownList扩展方法创建包含这些值的dropdown?

或者,我最好的办法就是简单地创建一个for循环,然后手动创建Html元素?

EN

回答 26

Stack Overflow用户

发布于 2009-01-11 11:48:21

我遇到了同样的问题,发现了这个问题,并认为Ash提供的解决方案不是我想要的;与内置的Html.DropDownList()函数相比,必须自己创建HTML意味着灵活性较低。

事实证明,C#3等让这件事变得非常简单。我有一个名为TaskStatusenum

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使它变得更加优雅。无意冒犯,阿什。:)

票数 135
EN

Stack Overflow用户

发布于 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();
    }
}
票数 50
EN

Stack Overflow用户

发布于 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是枚举

也许做帮助器功能更好,但当时间很短时,这将完成工作。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/388483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档