从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显示枚举值默认项问题的更多相关文章

  1. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  2. Asp.Net MVC4开发二: Entity Framework在Asp.Net MVC4中的应用

    ORM作为一种数据库訪问机制已广泛地应用于各种项目其中,在.Net开发中,应用比較广泛的ORM框架大致有以下几个: 官方支持的有:Linq to SQL.Entity Framework.三方的有:N ...

  3. ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)

    在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...

  4. WebSocket在ASP.NET MVC4中的简单实现

    WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...

  5. ASP.NET MVC4中使用NHibernate

    ASP.NET MVC4中使用NHibernate 1:下载安装NHibernate 打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages.你会 ...

  6. 在ASP.NET MVC4中实现同页面增删改查,无弹出框02,增删改查界面设计

    在上一篇"在ASP.NET MVC4中实现同页面增删改查,无弹出框01,Repository的搭建"中,已经搭建好了Repository层,本篇就剩下增删改查的界面了......今 ...

  7. ASP.NET MVC4中的App_start中BundleConfig的介绍使用

    在BundleConfig.cs中,指定CSS和JS,主要用来压缩JS和CSS   在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压 ...

  8. ASP.NET MVC4中对JS和CSS的引用

    https://www.cnblogs.com/madyina/p/3702314.html ASP.NET MVC4中对JS和CSS的引用又做了一次变化,在MVC3中我们这样引用资源文件: < ...

  9. [转]ASP.NET MVC中的两个Action之间值的传递--TempData

    本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...

随机推荐

  1. python格式化输出【转】

    今天写代码时,需要统一化输出格式进行,一时想不起具体细节,用了最笨的方法,现在讲常见的方法进行一个总结. 一.格式化输出 1.整数的输出 直接使用'%d'代替可输入十进制数字: >>> ...

  2. Ansible Tower系列 四(使用tower执行一个命令)【转】

    在主机清单页面中,选择一个主机清单,进入后,选择hosts里的主机 Paste_Image.png 点击 RUN COMMANDS MODULE 选择 commandARGUMENTS 填写 ifco ...

  3. MAC连接安卓手机通过adb指令安装apk

    Android的apk可以通过adb命令来安装.在MAC电脑上,如果想通过命令行的方式给安卓手机安装apk,需要做以下操作: 一句话概括就是:将安卓SDK的adb命令添加到环境变量中,然后通过adb ...

  4. [转]mysql性能优化-慢查询分析、优化索引和配置

    一. 优化概述 MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在 ...

  5. 洛谷P1886 滑动窗口

    传送门啦 以最大值为例,既然我们想要保证队列开头为答案,那么我们就要保证每次更新使最大值一直放在队列.那么如果存储的最大值该弹出了怎么办呢?我们只需要记录下每个元素的位置,判断是否在区间内即可. 队头 ...

  6. 如何安装pycharm

    Ubuntu系统安装PyCharm教程(详细图文) 参考(http://jingyan.baidu.com/article/60ccbceb4e3b0e64cab19733.html)  

  7. 使用SOCKET获取网页的内容

    使用fsockopen()函数来实现获取页面信息,完整代码如下 //设置字符集(由于要抓取的网易网站字符集编码是gbk编码) header("content-type:text/html;c ...

  8. java学习之租车系统

    ​背景:有三种类型的车供给用户来租用​ ​要求:控制台用户交互界面,根据用户需求输出租车价格,结果如下: 创建租车类主要设计过程: 创建租车类 创建Car父类,包含四种属性成员,重写构造方法 创建三种 ...

  9. 【Android Studio】为Android Studio设置HTTP代理

    [Android Studio]为Android Studio设置HTTP代理   大陆的墙很厚很高,初次安装Android Studio下载SDK等必定失败,设置代理方法如下: 1. 到androi ...

  10. BZOJ3252 攻略 [树链剖分]

    题目传送门 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1169  Solved: 554[Submit][Status][Discuss] ...