关于c#:如何将枚举的值导入SelectList

How to get the values of an enum into a SelectList

假设我有一个这样的枚举(举个例子):

1
2
3
4
5
public enum Direction{
    Horizontal = 0,
    Vertical = 1,
    Diagonal = 2
}

如果枚举的内容将来可能发生更改,我如何编写一个将这些值放入System.Web.MVC.SelectList的例程?我想获取每个枚举名称作为选项文本,其值作为值文本,如下所示:

1
2
3
4
5
<select>
    <option value="0">Horizontal</option>
    <option value="1">Vertical</option>
    <option value="2">Diagonal</option>
</select>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 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);
 }

但是,这始终将选项文本呈现为"system.web.mvc.listem"。通过这个调试,我还可以看到Enum.GetValues()返回的是"水平、垂直"等,而不是如我所料的0、1,这让我想知道Enum.GetName()和Enum.GetValue()之间的区别是什么。


我已经有一段时间没有这样做了,但我认为这应该有效。

1
2
3
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);


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

http://www.asp.net/mvc/overview/releases/mvc51发行说明枚举

1
@Html.EnumDropDownListFor(model => model.Direction)