由于在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>)