由於在MVC中經常會使用到@Html.DropDownList方法,而該方法接收的是List<SelectListItem> 參數,因此就想着寫一個擴展方法,直接把IEnumerable轉換為List<SelectListItem>類型,這樣使用起來會比較方便
正式進入正文。
1、首先創建下面實體:
//水果類 public class Fruit { public string Code { get; set; } public string Name { get; set; } public string Color { get; set; } }
2、編寫擴展方法,把IEnumerable轉換為List<SelectListItem>類型,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using System.Web.Mvc; namespace Common { public static class Extensions { /// <summary> /// 擴展方法,IEnumerable<T>轉換為IList<SelectListItem> /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data">帶轉換的數據</param> /// <param name="Text"></param> /// <param name="Value"></param> /// <param name="selectValue"></param> /// <param name="NewItem">傳遞過來的SelectListItem,如請選擇……</param> /// <returns></returns> 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() { var list = new List<SelectListItem>(); if (NewItem != null) { list.Add(NewItem); } string _text = ""; string _value = ""; if (Text.Body is MemberExpression) { MemberExpression TextMember = (MemberExpression)Text.Body; _text = TextMember.Member.Name; } else if (Text.Body is UnaryExpression) { UnaryExpression TextMember = (UnaryExpression)Value.Body; _text = (TextMember.Operand as MemberExpression).Member.Name; } if (Value.Body is MemberExpression) { MemberExpression ValueMember = (MemberExpression)Text.Body; _value = ValueMember.Member.Name; } else if (Value.Body is UnaryExpression) { UnaryExpression ValueMember = (UnaryExpression)Value.Body; _value = (ValueMember.Operand as MemberExpression).Member.Name; } var type = new T().GetType(); var TextPropertyInfo = type.GetProperty(_text); var ValuePropertyInfo = type.GetProperty(_value); foreach (var item in data) { var selectItem = new SelectListItem() { Text = TextPropertyInfo.GetValue(item).ToString(), Value = ValuePropertyInfo.GetValue(item).ToString() }; if (!string.IsNullOrWhiteSpace(selectValue) && selectValue == selectItem.Value) { selectItem.Selected = true; } list.Add(selectItem); } return list; } }
3、調用方法如下:
ViewBag.Fruits = list.ToSelectListItem(it => it.Name, it => it.Color, "", new SelectListItem() { Text = "請選擇水果", Value = "", Selected = true }); @Html.DropDownList("Fruits ",ViewBag.Fruits as IList<SelectListItem>)
