• [2014-09-21]如何在 Asp.net Mvc 开发过程中更好的使用Enum



    场景描述

    在web开发过程中,有时候需要根据Enum类型生成下拉菜单;
    有时候在输出枚举类型的时候,又希望输出对应的更具描述性的字符串。
    喜欢直接用中文的请无视本文

    不多说,直接看代码。
    以下代码借鉴自http://stackoverflow.com/

    本文针对 Aspnet Mvc 4 开发而言

    Enum定义

    using System.ComponentModel;
    namespace xxxxx.yyyyy
    {
        public enum EN_ArticleType
        {
            [Description("软装家饰")]
            RuanZhuang=1,
         
            [Description("家居风水")]
            FengShui,
         
            [Description("装修技巧")]
            JiQiao,
         
            [Description("行业动态")]
            DongTai,
         
            [Description("样板美图")]
            MeiTu,
         
            [Description("人才招聘")]
            Jobs
        }
    }
    

    扩展HtmlHelper

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Web.Mvc;
    using System.Web.Mvc.Html;
    
    namespace xxxx.ExtendMethods
    {
        public static class HtmlHelperUtils
        {
            /// <summary>
            /// Creates the DropDown List (HTML Select Element) from LINQ 
            /// Expression where the expression returns an Enum type.
            /// </summary>
            /// <typeparam name="TModel">The type of the model.</typeparam>
            /// <typeparam name="TProperty">The type of the property.</typeparam>
            /// <param name="htmlHelper">The HTML helper.</param>
            /// <param name="expression">The expression.</param>
            /// <returns></returns>
            public static MvcHtmlString DropDownListForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
                Expression<Func<TModel, TProperty>> expression)
                where TModel : class
            {
                return htmlHelper.DropDownListForEnum(expression, null);
            }
    
            public static MvcHtmlString DropDownListForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
                Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
                where TModel : class
            {
                TProperty value = htmlHelper.ViewData.Model == null
                    ? default(TProperty)
                    : expression.Compile()(htmlHelper.ViewData.Model);
                string selected = value == null ? String.Empty : value.ToString();
                if (htmlAttributes == null)
                {
                    return htmlHelper.DropDownListFor(expression, createSelectList(expression.ReturnType, selected));
                }
                else
                {
                    return htmlHelper.DropDownListFor(expression, createSelectList(expression.ReturnType, selected), htmlAttributes);
                }
            }
    
            /// <summary>
            /// Creates the select list.
            /// </summary>
            /// <param name="enumType">Type of the enum.</param>
            /// <param name="selectedItem">The selected item.</param>
            /// <returns></returns>
            private static IEnumerable<SelectListItem> createSelectList(Type enumType, string selectedItem)
            {
                return (from object item in Enum.GetValues(enumType)
                        let fi = enumType.GetField(item.ToString())
                        let attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault()
                        let title = attribute == null ? item.ToString() : ((DescriptionAttribute)attribute).Description
                        select new SelectListItem
                        {
                            Value = item.ToString(),
                            Text = title,
                            Selected = selectedItem == item.ToString()
                        }).ToList();
            }
        }
    }
    

    视图层输出下拉菜单

     @Html.DropDownListForEnum(model => model.Type, new { @class = "col-sm-2" })
    

    扩展Enum

    using System;
    using System.ComponentModel;
    using System.Reflection;
    
    namespace xxxx.ExtendMethods
    {
        public static class EnumUtils
        {
            public static string GetEnumDescription(this Enum value)
            {
                FieldInfo fi = value.GetType().GetField(value.ToString());
    
                DescriptionAttribute[] attributes =
                    (DescriptionAttribute[])fi.GetCustomAttributes(
                    typeof(DescriptionAttribute),
                    false);
    
                if (attributes != null &&
                    attributes.Length > 0)
                    return attributes[0].Description;
                else
                    return value.ToString();
            }
        }
    }
    

    输出Enum value对应的Description

    @item.Type.GetEnumDescription()  //item是实体,Type是EN_ArticleType类型的属性
    

    结束

    请自行尝试。
    :)

  • 相关阅读:
    VC++中使用内存映射文件处理大文件
    802.1x协议解析
    Jscript中window.setInterval和window.setTimeout区别
    在C#中使用代理的方式触发事件
    JavaScript实用的一些技巧
    控制C#编的程序内存的占用
    纯C#钩子实现及应用(转)
    DES的建立过程
    C# 显示占用内存
    解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
  • 原文地址:https://www.cnblogs.com/personball/p/7455862.html
Copyright © 2020-2023  润新知