今天遇到的问题是这样的,我需要把一个枚举绑定到View(项目使用了ASP.NET MVC框架)上的下拉列表控件。
为了说明这个问题,先准备了一段代码,声明一个枚举,用来在页面上进行绑定
using System.ComponentModel;
namespace MvcApplication1.Views.Home
{
enum EnumExample
{
[Description("a")]
a = 1,
[Description("b")]
b = 2,
[Description("c")]
c = 3,
}
}
其实只是绑定这个枚举,还是挺简单的,首先向动态字典ViewBag里添加数据
ViewBag.EnumExampleData = from EnumExample p in Enum.GetValues(typeof(EnumExample))
select new SelectListItem
{
Text = p.ToString(),
Value = Convert.ToInt32(p).ToString()
};
然后在页面上用
@Html.DropDownListFor(p=>p.EnumExample,(IEnumerable<SelectListItem>)ViewBag.EnumExampleData)
就可以生成一个下拉列表控件了
但是这跟实际项目中的要求还稍有点儿差距,一般我们以枚举作为状态值或者属性值时,进行某些操作时,比如查询,有可能需要这个值为空(查所有状态),所以我们还需要在下拉控件中增加一个“请选择”或者“所有值”的项。
当然实现的方式会有很多种,前台直接使用JavaScript来添加,或者先维护一个包含枚举项值得列表,再向列表中添加一个“all”的项,等等等等。但我今天就是想在给ViewBag.EnumExampleData
赋值的时候一次性的就实现这个需求。由于对Linq真的不是太熟,琢磨出下面这么一种方法,给大家参考
ViewBag.EnumExampleData = (from q in new List<SelectListItem> { new SelectListItem { Text = "all", Value = "all" } }
select q)
.Concat(from EnumExample p in Enum.GetValues(typeof(EnumExample))
orderby p
select new SelectListItem
{
Text = p.ToString(),
Value = Convert.ToInt32(p).ToString()
});
方法不算聪明,就是用了一下Concat。如果大家有其他的方式也可以交流一下哈。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。