首页 > 解决方案 > 使用 Enum 作为 DropDownListFor 的数据源的无效转换异常

问题描述

我正在将枚举转换为IEnumerable<SelectListItem>我的控制器,以便在DropDownListFor助手中使用它。

var roleList = EnumHelper.GetSelectList(typeof(UserRole))
           .Cast<UserRole>()
           .Except(new UserRole[] { UserRole.Admin, UserRole.Corporate })
           .Select(e => new SelectListItem { Text = e.ToString(), Value = ((int)e).ToString() });
ViewBag.SelectList = roleList;

我的剃刀代码看起来像

@Html.DropDownListFor(m => m.RoleID, (IEnumerable<SelectListItem>)ViewBag.SelectList)

但我收到一个错误

System.InvalidCastException:指定的强制转换无效。

为了确保它是一个有效的演员,我检查roleList了控制器中的数据类型,它看起来很好,如下所示

投射错误

在运行时,我通过调试确保它ViewBag.SelectList不为空并且没有问题

调试模式

但是当我展开结果时,我收到错误消息

终于报错了

标签: asp.netasp.net-mvcrazorasp.net-mvc-5

解决方案


EnumHelper.GetSelectList返回IList<SelectListItem>然后Cast<UserRole>()抛出异常,因为它不能SelectListItem转换为UserRole. 为了获得所有enum值,请使用Enum.GetValues

var roleList = Enum.GetValues(typeof(UserRole))
       .Cast<UserRole>()
       .Except(new UserRole[] { UserRole.Admin, UserRole.Corporate })
       .Select(e => new SelectListItem { Text = e.ToString(), Value = ((int)e).ToString() });

推荐阅读