5

当您有一个需要显示为界面控件的域对象(如下拉列表)时,ifwdev建议创建一个扩展方法来添加一个 .ToSelectList()。

原始对象是具有与下拉列表的 .Text 和 .Value 属性相同的属性的对象列表。基本上,它是一个 SelectList 对象的列表,只是类名不同。

我想您可以使用反射将域对象转换为接口对象。有人对可以做到这一点的 C# 代码有任何建议吗?SelectList 是一个 MVC 下拉列表的 SelectListItem。

这个想法当然是在视图中做这样的事情:

<%= Html.DropDownList("City", 
         (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList() )
4

2 回答 2

4

SelectList制作对象的一部分更容易ViewModel

无论如何,您只需要循环IEnumerable并将每个项目添加到一个新SelectList对象并返回它。

public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
{ 
    var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
    return items; 
} 

如何将这两种类似的方法重构为一种?

于 2010-04-06T21:51:53.390 回答
4

这是我用来创建选择列表的两种扩展方法。

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value)
{
    return collection.ToSelectList(text, value, x => false);
}

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value, Func<T, bool> selected)
{
    return (from item in collection
            select new SelectListItem()
                       {
                           Text = text(item),
                           Value = value(item),
                           Selected = selected(item)
                       });
}

HTH,
查尔斯

于 2010-04-06T22:20:26.843 回答