解决ASP.NET MVC4中使用Html.DropDownListFor显示枚举值默认项问题
从ASP.NET MVC 5开始,Html.DropDownListFor已经提供了对Enum的支持,但在这以前,需要通过帮助方法或扩展方法来让Html.DropDownListFor显示枚举值。
本篇解决在ASP.NET MVC 4 下Html.DropDownListFor显示默认项的问题。

以上,使用Select是通过Html.DropDownListFor来实现的,Select的选项值是从枚举中读出。可以看到,某个枚举值成了默认选项,而我想让"==请选择=="成为Select的默认选项。
在找到解决方法之前,先让问题重现。
有这样的一个枚举。
public enum Status{[EnumDisplayName("启用")]Enabled = 0,[EnumDisplayName("禁用")]Disabled = 1}
有这样的一个View Model的Status属性用来存放枚举的某个值。
public class MyChoice{public short Status { get; set; }}
这里需要帮助方法,能读取枚举的自定义特性EnumDisplayName和枚举值。
首先是自定义特性。
public class EnumDisplayNameAttribute : Attribute{private string _displayName;public EnumDisplayNameAttribute(string displayName){_displayName = displayName;}public string DisplayName{get{return _displayName;}}}
然后,帮助方法使用反射把元数据读取出来,最终得到一个SelectListItem的集合。
/// <summary>/// 把枚举转换成SelectListItem/// </summary>public class EnumExt{/// <summary>/// 获取枚举成员的自定义Attribute的一个属性值/// </summary>/// <param name="e">枚举成员</param>/// <returns></returns>public static string GetEnumDescription(object e){//获取枚举成员的Type对象Type t = e.GetType();//获取Type对象的所有字段FieldInfo[] ms = t.GetFields();//遍历所有字段foreach (FieldInfo f in ms){if (f.Name != e.ToString()){continue;}if (f.IsDefined(typeof(EnumDisplayNameAttribute), true)){return (f.GetCustomAttributes(typeof(EnumDisplayNameAttribute), true)[0] as EnumDisplayNameAttribute).DisplayName;}}return e.ToString();}public static List<SelectListItem> GetSelectList(Type enumType){List<SelectListItem> selectList = new List<SelectListItem>();//selectList.Add(new SelectListItem { Text = "--请选择--", Value = "",Selected = true});foreach (object e in Enum.GetValues(enumType)){selectList.Add(new SelectListItem { Text = GetEnumDescription(e), Value = ((int)e).ToString() });}return selectList;}}
在控制器中,通过ViewData把SelectListItem的集合实例传递到前台。
public ActionResult Index(){ViewData["s"] = EnumExt.GetSelectList(typeof(Status));return View(new MyChoice());}
在视图页中:
@Html.DropDownListFor(m => m.Status,(IEnumerable<SelectListItem>)ViewData["s"],"==请选择==")
现在,就出现了本篇刚开始提到的问题:Select的默认选项是某个枚举值,而不是"==请选择=="。
因为枚举的默认值是0,所以在显示Select的时候,总是把枚举值为0枚举项显示了出来。
既然枚举的默认值是无法改变的,那就让枚举值为0的枚举项的自定义特性显示"==请选择=="。
public enum Status{[EnumDisplayName("==请选择==")]None = 0,[EnumDisplayName("启用")]Enabled = 1,[EnumDisplayName("禁用")]Disabled = 2}
再修改视图页中的部分,Html.DropDownListFor不需要提示文字。
@Html.DropDownListFor(m => m.Status,(IEnumerable<SelectListItem>)ViewData["s"])
最后,得到了想要的效果。
解决ASP.NET MVC4中使用Html.DropDownListFor显示枚举值默认项问题的更多相关文章
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- Asp.Net MVC4开发二: Entity Framework在Asp.Net MVC4中的应用
ORM作为一种数据库訪问机制已广泛地应用于各种项目其中,在.Net开发中,应用比較广泛的ORM框架大致有以下几个: 官方支持的有:Linq to SQL.Entity Framework.三方的有:N ...
- ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)
在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...
- WebSocket在ASP.NET MVC4中的简单实现
WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...
- ASP.NET MVC4中使用NHibernate
ASP.NET MVC4中使用NHibernate 1:下载安装NHibernate 打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages.你会 ...
- 在ASP.NET MVC4中实现同页面增删改查,无弹出框02,增删改查界面设计
在上一篇"在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建"中,已经搭建好了Repository层,本篇就剩下增删改查的界面了......今 ...
- ASP.NET MVC4中的App_start中BundleConfig的介绍使用
在BundleConfig.cs中,指定CSS和JS,主要用来压缩JS和CSS 在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压 ...
- ASP.NET MVC4中对JS和CSS的引用
https://www.cnblogs.com/madyina/p/3702314.html ASP.NET MVC4中对JS和CSS的引用又做了一次变化,在MVC3中我们这样引用资源文件: < ...
- [转]ASP.NET MVC中的两个Action之间值的传递--TempData
本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...
随机推荐
- 关于RestFul API 介绍与实践
之前演示的PPT,直接看图... •参考链接: •RESTful API 设计最佳实践 •RESTful API 设计指南 •SOAPwebserivce和RESTfulwebservice对 ...
- shell中后台进程管理: ps -aux 详解
常用 查找进程id方法: ps -aux | grep "jupyter" 杀进程: kill -9 具体的PID 1.ps命令 要对进 ...
- 更改jupyter notebook的主题颜色(theme) 包括pycharm
https://blog.csdn.net/Techmonster/article/details/73382535
- Coursera台大机器学习技法课程笔记12-Neural Network
由perceptron线性组成的一个神经网络: 通过赋予g不同的权值,来实现不同的切分功能: 但有的切分只通过一次特征转换是不够的,需要多次转换,如下: Neural Network Hypothes ...
- Python 驱动 MongoDB 示例(PyMongo)
Python 的MongoDB驱动 pymongo ,使用pip Install pymongo安装即可 最近发现网上的很多实例已经过时了,在此自我探究记录下来. 编写一个接口类来支持MongoDB的 ...
- .NetCore中使用ExceptionLess 添加操作日志
上一篇文章已经扩展了日志,下面我们在结合下处理操作日志 通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 Ip 下面我们就来结合这些信息添加操作日志 如果要在代 ...
- [BZOJ2616]SPOJ PERIODNI 树形dp+组合数+逆元
2616: SPOJ PERIODNI Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 128 Solved: 48[Submit][Status][ ...
- 配置Gitlab使用LDAP认证
1. 通过SSH登陆Gitlab服务器. 2. 进行以下配置文件夹. [root@c720141 ~]# cd /etc/gitlab/ 3. 打开gitlab.rb配置文件,并加入以下配置. git ...
- Wireshark、Netcat
Wireshark Wireshark是一个网络数据包分析软件,功能是截取网络数据包,并尽可能显示出最为详细的网络数据包数据.为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发 ...
- ubuntu18.04初始化配置
目录 ubuntu18.04初始化配置 ifconfig sshd smb other vim 配置 最后 ubuntu18.04初始化配置 虚拟机挂了, 又得重新安装配置一遍, 这里记录了我几乎每次 ...