在实际应用中,我们经常会用到下拉框、多选、单选等类似的控件,我们可以统称他们为List Control,他们可以说都是一种类型的控件,相同之处都是由一个或一组键值对的形式的数据进行绑定渲染而成的。

这些List Control的数据来源通常为数据库,固定值,但是有时候我们也会把数据写入在枚举或配置文件中,这篇文章针对数据写入枚举的情况下,如何在ASP.NET MVC中将枚举类型的数据读取并渲染成为List Control控件(下拉框、多选、单选等)

方法其实有很多种,但是疏通同归,基本都是先加载枚举类型,随后将枚举类型的数据转为字典类型或者数组类型。

1)转换为数组类型(en为一个枚举类型的实例)

 FieldInfo fi = en.GetType().GetField(en.ToString());
object[] attrs = fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

  2)转换为字典类型(推荐)

Type enumType = typeof(T);
string[] fieldstrs = Enum.GetNames(enumType);
//随后循环即可
foreach (var item in fieldstrs)

  而第二种转换为字典的方式比较常见,代码都是类似的,博主从网络找到了两种类型的写法,大家可以参考下:

方法一:

public class EnumHelper
{
/// <summary>
/// 枚举转字典集合
/// </summary>
/// <typeparam name="T">枚举类名称</typeparam>
/// <param name="keyDefault">默认key值</param>
/// <param name="valueDefault">默认value值</param>
/// <returns>返回生成的字典集合</returns>
public static Dictionary<string, object> EnumListDic<T>(string keyDefault, string valueDefault = "")
{
Dictionary<string, object> dicEnum = new Dictionary<string, object>();
Type enumType = typeof(T);
if (!enumType.IsEnum)
{
return dicEnum;
}
if (!string.IsNullOrEmpty(keyDefault)) //判断是否添加默认选项
{
dicEnum.Add(keyDefault, valueDefault);
}
string[] fieldstrs = Enum.GetNames(enumType); //获取枚举字段数组
foreach (var item in fieldstrs)
{
string description = string.Empty;
var field = enumType.GetField(item);
object[] arr = field.GetCustomAttributes(typeof(DescriptionAttribute), true); //获取属性字段数组
if (arr != null && arr.Length > 0)
{
description = ((DescriptionAttribute)arr[0]).Description; //属性描述
}
else
{
description = item; //描述不存在取字段名称
}
dicEnum.Add(description, (int)Enum.Parse(enumType, item)); //不用枚举的value值作为字典key值的原因从枚举例子能看出来,其实这边应该判断他的值不存在,默认取字段名称
}
return dicEnum;
}
} public enum TestEmun
{
[Description("主系统")]
AAA = 1,
[Description("订单子系统")]
BBB = 2,
[Description("CRM子系统")]
CCC = 3
} public ActionResult Index()
{
Dictionary<string,object> dropDic=EnumHelper.EnumListDic<TestEmun>("","");
ViewBag.dropList = new SelectList(dropDic,"value","key");
//随后在视图中直接使用 ViewBag.dropList 作为数据源就可以
return View();
}

  View视图加载数据源并渲染:

<!--绑定DropdownList 下拉列表 其他List Control也是类似的-->
@Html.DropDownList("dropList", null, new { })

  方法二:直接将枚举转为List<SelectListItem>类型的数据,这样用起来更方便

/// <summary>
/// 枚举转字典集合
/// </summary>
/// <typeparam name="T">枚举类名称</typeparam>
/// <param name="keyDefault">默认key值</param>
/// <param name="valueDefault">默认value值</param>
/// <returns>返回生成的字典集合</returns>
public static List<SelectListItem> GetSelectListItem<T>(object keyDefault)
{
List<SelectListItem> dicEnum = new List<SelectListItem>();
Type enumType = typeof(T);
if (!enumType.IsEnum)
return dicEnum;
string[] fieldstrs = Enum.GetNames(enumType); //获取枚举字段数组
foreach (var item in fieldstrs)
{
string description = string.Empty;
var field = enumType.GetField(item);
object[] arr = field.GetCustomAttributes(typeof(DescriptionAttribute), true); //获取属性字段数组
if (arr != null && arr.Length > 0)
description = ((DescriptionAttribute)arr[0]).Description; //属性描述
else
description = item; //描述不存在取字段名称
//判断是否添加默认选项
if (keyDefault != null && keyDefault.Equals(Enum.Parse(enumType, item)))
{
dicEnum.Add(new SelectListItem() { Text = description, Selected = true, Value = Enum.Parse(enumType, item).ToString() });
}
else
{
dicEnum.Add(new SelectListItem() { Text = description, Value = Enum.Parse(enumType, item).ToString() });
}
}
return dicEnum;
}

  使用的时候直接调用GetSelectListItem方法即可,得到的是一个List<SelectListItem>类型的数据,这种数据格式类型在ASP.NET MVC的视图中是直接可以对List Control使用的。

注意:以上的方法一方法二都需要引入 System.Web.Mvc,注意引用

ASP.NET MVC 枚举类型转LIST CONTROL控件的更多相关文章

  1. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  2. ASP.NET MVC显示WebForm网页或UserControl控件

    ASP.NET MVC显示WebForm网页或UserControl控件 学习与使用ASP.NET MVC这样久,还是对asp.net念念不忘.能否在asp.net mvc去显示aspx或是user ...

  3. ASP.NET MVC中加载WebForms用户控件(.ascx)

    原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...

  4. 念念不忘,ASP.NET MVC显示WebForm网页或UserControl控件

    学习与使用ASP.NET MVC这样久,还是对asp.net念念不忘.能否在asp.net mvc去显示aspx或是user control呢?这个灵感(算不上灵感,只能算是想法)是来自前些天有写过一 ...

  5. asp.net MVC 枚举类型的处理的几种方式

    枚举类型本质上是int类型,整型,这是非常重要的一点. 可以使用(int)将它强制转换为 整形.如果要使用MVC5提供的新辅助方法@Html.EnumDropDownListFor()方法,就必须将枚 ...

  6. Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件

    在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...

  7. ASP.NET MVC 描述类型(二)

    ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...

  8. ASP.NET MVC 描述类型(一)

    ASP.NET MVC 描述类型(一) 前言 在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器(一)篇幅中简单的描述过,今天我们就来讲一下 ...

  9. Asp.Net Mvc 返回类型总结

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

随机推荐

  1. Type curtilage home

    This year's National Day coincides with the Mid-Autumn festival, the double false merger about eight ...

  2. Python常用数据类型

    一 .列表 name = ['zhangshan', 'lishi', 'wangwu']# 列表赋值 name.append('liujun')# 增,默认增加到最后位置 name.insert(1 ...

  3. 173zrx个人简介

    码云链接:https://gitee.com/zhrx-617/codes/947dbs2fi5kw3jz8hc0ma74 效果图: 源代码: <html> <head> &l ...

  4. Windows Server 2012系统上安装.net framework3.5教程

    1.先下载WIN2012R2安装NET3.5的专用数据源 https://pan.baidu.com/s/1bqiUTyR 提取码h09k 并解压,比如解压到桌面,解压后的路径为C:\Users\Ad ...

  5. 通过重写request.getParameter方法来解决中文乱码问题。

    在原生servlet的商城项目中,BeanUtils.populate方法封装不上注册的参数. 已知BeanUtils.populate方法是封装不上date对象的,于是自定义了一个转换器用来封装Da ...

  6. vue生命周期和钩子函数

    new Vue 创建vue实例 init events & liftcycle 开始初始化 beforeCreate 组件刚被创建,组件属性计算之前,如data属性等 init injecti ...

  7. makefile笔记8 - make的运行

    一般来说,最简单的就是直接在命令行下输入 make 命令, make 命令会找当前目录的makefile 来执行,一切都是自动的.但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有 ...

  8. dede织梦系统接入熊掌号推送api,完整详细教程

    第一步:     根据熊掌号要求完成校验页面,官方文档很详细,照着弄就行了 第二步: 开始后台改造 1.进入后台文件夹dede(自己实际的文件夹),然后进入templets目录,打开body_inde ...

  9. Delphi非官方的补丁

    http://git.kngstr.com/KngStr/delphi-fixes 使用方法 方法一: 1. 拷贝需要的补丁文件到你的工程目录 2. 拷贝编译的时候缺少或错误的文件到你的工程目录 优缺 ...

  10. 从网络上获取图片,并写入excel文件

    package com.weChat.utils; import com.manage.utils.DateUtil;import com.manage.utils.MD5Util;import or ...