扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用

 

由于在MVC中经常会使用到@Html.DropDownList方法,而该方法接收的是List<SelectListItem> 参数,因此就想着写一个扩展方法,直接把IEnumerable转换为List<SelectListItem>类型,这样使用起来会比较方便

正式进入正文。

1、首先创建下面实体:

  1. //水果类
  2. public class Fruit
  3. {
  4. public string Code { get; set; }
  5. public string Name { get; set; }
  6. public string Color { get; set; }
  7. }

2、编写扩展方法,把IEnumerable转换为List<SelectListItem>类型,代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Web.Mvc;
  8.  
  9. namespace Common
  10. {
  11. public static class Extensions
  12. {
  13. /// <summary>
  14. /// 扩展方法,IEnumerable<T>转换为IList<SelectListItem>
  15. /// </summary>
  16. /// <typeparam name="T"></typeparam>
  17. /// <param name="data">带转换的数据</param>
  18. /// <param name="Text"></param>
  19. /// <param name="Value"></param>
  20. /// <param name="selectValue"></param>
  21. /// <param name="NewItem">传递过来的SelectListItem,如请选择……</param>
  22. /// <returns></returns>
  23. public static IList<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> data, Expression<Func<T, object>> Text, Expression<Func<T, object>> Value, string selectValue = "",SelectListItem NewItem=null) where T : class,new()
  24. {
  25. var list = new List<SelectListItem>();
  26. if (NewItem != null)
  27. {
  28. list.Add(NewItem);
  29. }
  30. string _text = "";
  31. string _value = "";
  32. if (Text.Body is MemberExpression)
  33. {
  34. MemberExpression TextMember = (MemberExpression)Text.Body;
  35. _text = TextMember.Member.Name;
  36. }
  37. else if (Text.Body is UnaryExpression)
  38. {
  39. UnaryExpression TextMember = (UnaryExpression)Value.Body;
  40. _text = (TextMember.Operand as MemberExpression).Member.Name;
  41. }
  42. if (Value.Body is MemberExpression)
  43. {
  44. MemberExpression ValueMember = (MemberExpression)Text.Body;
  45. _value = ValueMember.Member.Name;
  46. }
  47. else if (Value.Body is UnaryExpression)
  48. {
  49. UnaryExpression ValueMember = (UnaryExpression)Value.Body;
  50. _value = (ValueMember.Operand as MemberExpression).Member.Name;
  51. }
  52. var type = new T().GetType();
  53. var TextPropertyInfo = type.GetProperty(_text);
  54. var ValuePropertyInfo = type.GetProperty(_value);
  55. foreach (var item in data)
  56. {
  57. var selectItem = new SelectListItem() { Text = TextPropertyInfo.GetValue(item).ToString(), Value = ValuePropertyInfo.GetValue(item).ToString() };
  58. if (!string.IsNullOrWhiteSpace(selectValue) && selectValue == selectItem.Value)
  59. {
  60. selectItem.Selected = true;
  61. }
  62. list.Add(selectItem);
  63. }
  64.  
  65. return list;
  66. }
  67.  
  68. }

3、调用方法如下:

  1. ViewBag.Fruits = list.ToSelectListItem(it => it.Name, it => it.Color, "", new SelectListItem() { Text = "请选择水果", Value = "", Selected = true });
  2.  
  3. @Html.DropDownList("Fruits ",ViewBag.Fruits as IList<SelectListItem>)
 
 
标签: MVC

IEnumerable<T>转换为IList<SelectListItem>的更多相关文章

  1. 扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用

    由于在MVC中经常会使用到@Html.DropDownList方法,而该方法接收的是List<SelectListItem> 参数,因此就想着写一个扩展方法,直接把IEnumerable转 ...

  2. IEnumerable<T> 转换为数组

    IEnumerable<User> userlist=xxxx; string[] ids=userlist.select(u=>u.id).toArray();

  3. IEnumerable,ICollection,IList,List之间的区别

    做C#的同学们,都知道,一类只能有一个继承类,但可以实现多个接口.这句话就告诉我们:IEnumerable,ICollection,IList,List区别了 // 摘要: // 公开枚举器,该枚举器 ...

  4. IEnumerable、IEnumerator、ICollection、IList、List的继承关系及简单使用

    IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,IEnumerable和I ...

  5. C# IEnumerable与IQueryable ,IEnumerable与IList ,LINQ理解Var和IEnumerable

    原文:https://www.cnblogs.com/WinHEC/articles/understanding-var-and-ienumerable-with-linq.html 使用LINQ从数 ...

  6. 对象列表转换为DataTable或DataTable转换为对象列表.

    /**********************************************************************************/ // 说明: 数据转换工具. ...

  7. IEnumerable和List有什么区别?

    如下.IList接口可以使用更多的方法.比如你看一个集合是否包含相应实体, IEnumerable不行,而 IList里有Contains,相应的实现了IList的可以添加,删除相应实体.而IEnum ...

  8. DataTable转换为List<Model>的通用类

    在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便. 所以很多人都是按照以下方式做的: // 获得查询结果DataTable dt = DbHelper ...

  9. MVC学习笔记--IEnumerable的用法

    IEnumerable的用法 IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现 并支持非泛型方法的简单的 ...

随机推荐

  1. WebGL 支持测试,并已支持的浏览器版本摘要

    WebGL 支持情况检測与已支持浏览器版本号汇总 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...

  2. CMap与hash_map效率对照

    CMap与hash_map底层均採用hash stable实现,CMap是MFC提供的模板类.hash_map尽管眼下并未纳入C++标准模板类库,但差点儿每一个版本号的STL都提供了对应的实现.CMa ...

  3. 通过管道进行线程间通信:字节流。字符流的用法及API类似

    管道流(PipedStream)可以用于不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西. p ...

  4. HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. 2机器学习实践笔记(k-最近邻)

    1:算法是简单的叙述说明 由于训练数据样本和标签,为测试数据的示例,从最近的距离k训练样本,此k练样本中所属类别最多的类即为该測试样本的预測标签. 简称kNN.通常k是不大于20的整数,这里的距离通常 ...

  6. NPOI实现Excel导入导出

    NPOI实现Excel的导入导出,踩坑若干. Cyan是博主[Soar360]自2014年以来开始编写整理的工具组件,用于解决现实工作中常用且与业务逻辑无关的问题. 什么是NPOI? NPOI 是 P ...

  7. 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题

    今天在处理数据库过程中碰到这样的问题在插入一条数据到表中 系统报这样的错误 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题 表有一列是自增长的 ...

  8. TFTP server组态

    TFTP server组态 2014-10-31北京海淀区  张俊浩 一.TFTP(Trivial File Transfer Protocol,简单文件传输协议或称小型文件传输协议) 是一种简化的文 ...

  9. 【Android UI设计和开发】动画(Animation)详细说明(一)

    Android开发之动画效果浅析 请尊重他人的劳动成果.转载请注明出处:Android开发之动画效果浅析 程序执行效果图: Android动画主要包括补间动画(Tween)View Animation ...

  10. Linux常用命令2--用户问题、文件的打包压缩

    Linux常用命令 如何进行用户和群组的创建和更改 [1]groupadd:用于创建新的群组. 语法:groupadd [-option] 用户名:其常用参数有:-g groupadd -g 555 ...