如何将枚举的值获取到SelectList中
如何将枚举的值获取到SelectList中
假设我有一个枚举类型如下(仅作为示例):
public enum Direction{ Horizontal = 0, Vertical = 1, Diagonal = 2 }
如何编写一个函数将这些值放入`System.Web.Mvc.SelectList`中,考虑到枚举的内容可能会在将来发生变化?我希望每个枚举的名称作为选项文本,值作为值文本,如下所示:
目前这是我能想到的最好办法:
public static SelectList GetDirectionSelectList() { Array values = Enum.GetValues(typeof(Direction)); Listitems = new List (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.ListItem'。通过调试发现,`Enum.GetValues()`返回的是'Horizontal,Vertical'等,而不是我预期的0、1,这让我想知道`Enum.GetName()`和`Enum.GetValue()`之间的区别是什么。
如何将枚举的值获取到SelectList中
在这里我刚刚做了一些工作,个人认为它很性感:
public static IEnumerableGetEnumSelectList () { return (Enum.GetValues(typeof(T)).Cast ().Select( enu => new SelectListItem() { Text = enu.ToString(), Value = enu.ToString() })).ToList(); }
我最终要做一些翻译工作,所以Value = enu.ToString()将调用某个地方的某个内容。
我在这段代码中遇到了一个问题。SelectList的"Value"与"Text"相同。当在EntityFramework中使用枚举时,保存回数据库的值必须是int类型。
好吧,那么就这样做:Value = (int)enu
上面的例子中,(int)enu不起作用的原因是SelectListItem的Value属性是一个字符串,而不是整数。((int)enu).ToString()将起作用。
不,它不会起作用。在上面的例子中,在编译时它不知道T
的类型。因此,你不能像那样将其转换为int
。
从C# 7.3开始,你现在可以添加'where T : System.Enum'。
问题的出现原因是作者想要将一个枚举类型的值转换成一个SelectList对象,但是在转换过程中遇到了一些问题。解决方法是使用LINQ查询枚举类型的所有值,并将其转换成一个匿名类型的集合,然后将这个集合作为参数传递给SelectList的构造函数,同时还需要指定匿名类型中的属性用于显示在下拉列表中的文本和值。在代码中,作者使用了Enum.GetValues方法来获取枚举类型的所有值,然后使用LINQ查询将其转换成一个包含ID和Name属性的匿名类型的集合。最后,使用这个集合创建一个SelectList对象,并传递一些选中的值作为参数。
以下是整理后的文章:
最近我需要将一个枚举类型的值转换成一个SelectList对象,经过一番搜索,我找到了一段代码可以实现这个功能。代码如下:
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);
这段代码使用了LINQ查询来获取枚举类型的所有值,并将其转换成一个匿名类型的集合。在匿名类型中,我们定义了两个属性:ID和Name。其中ID属性的值是枚举值的整数表示,而Name属性的值是枚举值的字符串表示。
然而,当我尝试运行这段代码时,发现它几乎可以正常工作,只需要进行一个小的修改。原本代码中,将枚举值赋值给ID属性时,使用了`ID = d`这样的写法,但是我想要的是将枚举值的整数表示赋值给ID属性。所以,我将代码修改为`ID = (int)d`,这样就解决了问题。感谢原作者的帖子,否则我可能永远都不会想到这个问题!
虽然这段代码解决了我遇到的问题,但是我发现如果想要预先填充下拉列表的值,需要将值设置为枚举的字符串表示,而不是整数表示。这可能是因为SelectList对象只接受字符串类型的值作为参数。
在ASP.NET MVC 5.1中,有一个新的功能可以将枚举的值放入SelectList中。使用EnumDropDownListFor方法可以实现这个功能。但是,有人想知道是否有一个taghelper版本的方法可以实现相同的功能。答案是肯定的,可以使用<select asp-items="Html.GetEnumSelectList<Direction>()"></select>
来实现。然后,有人问如何从控制器中获取这个选择的值。
解决方法如下:
1. 首先,在ASP.NET MVC 5.1中使用EnumDropDownListFor方法将枚举的值放入SelectList中。
2. 使用<select asp-items="Html.GetEnumSelectList<Direction>()"></select>
来实现taghelper版本的功能。
3. 在控制器中可以通过以下方式获取选择的值。