如何将枚举的值转换为SelectList

Lee*_*e D 66 c# asp.net-mvc enums

想象一下,我有一个这样的枚举(仅作为一个例子):

public enum Direction{
    Horizontal = 0,
    Vertical = 1,
    Diagonal = 2
}
Run Code Online (Sandbox Code Playgroud)

我如何编写一个例程来将这些值放入System.Web.Mvc.SelectList中,因为枚举的内容将来会发生变化?我想将每个枚举名称作为选项文本,并将其值作为值文本,如下所示:

<select>
    <option value="0">Horizontal</option>
    <option value="1">Vertical</option>
    <option value="2">Diagonal</option>
</select>
Run Code Online (Sandbox Code Playgroud)

这是迄今为止我能想到的最好的:

 public static SelectList GetDirectionSelectList()
 {
    Array values = Enum.GetValues(typeof(Direction));
    List<ListItem> items = new List<ListItem>(values.Length);

    foreach (var i in values)
    {
        items.Add(new ListItem
        {
            Text = Enum.GetName(typeof(Direction), i),
            Value = i.ToString()
        });
    }

    return new SelectList(items);
 }
Run Code Online (Sandbox Code Playgroud)

但是,这总是将选项文本呈现为"System.Web.Mvc.ListItem".通过这个调试也告诉我,Enum.GetValues()正在返回'Horizo​​ntal,Vertical'等而不是0,1,正如我所期望的那样,这让我想知道Enum.GetName()和Enum之间有什么区别.的GetValue().

Bra*_*don 83

已经有一段时间了,因为我必须这样做,但我认为这应该有效.

var directions = from Direction d in Enum.GetValues(typeof(Direction))
           select new { ID = (int)d, Name = d.ToString() };
return new SelectList(directions , "ID", "Name", someSelectedValue);
Run Code Online (Sandbox Code Playgroud)

  • 几乎工作,只需要一个小的改变!当OP希望它是一个整数时,你的代码会将值设置为Text.虽然容易修复.将`ID = d`更改为`ID =(int)d`.感谢发布这个,我从来没有想过它! (5认同)

Fre*_*red 37

ASP.NET MVC 5.1中有一个新功能.

http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum

@Html.EnumDropDownListFor(model => model.Direction)
Run Code Online (Sandbox Code Playgroud)

  • @SerjSagan,是的.`<select asp-items ="Html.GetEnumSelectList <Direction>()"> </ select>`. (3认同)

Dan*_*ann 32

这就是我刚刚制作的,我个人觉得它很性感:

 public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
        {
            return (Enum.GetValues(typeof(T)).Cast<T>().Select(
                enu => new SelectListItem() { Text = enu.ToString(), Value = enu.ToString() })).ToList();
        }
Run Code Online (Sandbox Code Playgroud)

我最终会做一些翻译工作,所以Value = enu.ToString()会调用某个地方的东西.


And*_*are 27

要获取枚举的值,您需要将枚举转换为其基础类型:

Value = ((int)i).ToString();
Run Code Online (Sandbox Code Playgroud)


小智 22

我想做一些与Dann的解决方案非常相似的东西,但是我需要将Value作为int并将文本作为Enum的字符串表示.这就是我想出的:

public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
    {
        return (Enum.GetValues(typeof(T)).Cast<int>().Select(e => new SelectListItem() { Text = Enum.GetName(typeof(T), e), Value = e.ToString() })).ToList();
    }
Run Code Online (Sandbox Code Playgroud)


Fre*_*red 9

在ASP.NET Core MVC中,这是使用标记帮助程序完成的.

<select asp-items="Html.GetEnumSelectList<Direction>()"></select>
Run Code Online (Sandbox Code Playgroud)