我在数据库中有大约10个非常简单的表:
create table EmploymentStatus
(
Id int identity(1,1) Primary Key,
Name nvarchar(100) NOT NULL
)
这些表用于注册视图上的DropDownLists
,如下所示:
@Html.DropDownListFor(m => m.EmploymentStatus, Model.EmploymentStatusList, Resource.EmploymentStatus, new { @class = "form form-control" })
DropDownListFor
需要IEnumerable<SelectListItem> selectList
作为集合。
所以,我创建了一个方法:
public static List<SelectListItem> ToSelectItemList(IQueryable<EmploymentStatu> statuses)
{
return statuses.Select(m => new SelectListItem
{
Text = m.Name,
Value = m.Id.ToString()
}).ToList();
}
问题是我必须为十个实体中的每一个创建一个方法。是否有一种编写一些通用方法的好方法,如下所示:
public static List<SelectListItem> ToSelectItemList(IQueryable<T> collection)
{
return collection.Select(m => new SelectListItem
{
Text = m.Name,
Value = m.Id.ToString()
}).ToList();
}
答案 0 :(得分:8)
您可以为要用于DropDownLists的所有实体定义接口,例如
public interface IDropDownItem
{
int Id {get; set;}
string Name {get; set;}
}
然后
public static List<SelectListItem> ToSelectItemList<T>(IEnumerable<T> collection)
where T : IDropDownItem
{
return collection.Select(m => new SelectListItem
{
Text = m.Name,
Value = m.Id.ToString()
}).ToList();
}
最好将ToSelectItemList
作为扩展方法:
public static class EnumerableExtensions
{
public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> collection)
where T : Program
{
return collection.Select(m => new SelectListItem
{
Text = m.Name,
Value = m.Id.ToString()
}).ToList();
}
}
答案 1 :(得分:5)
有两种选择:
如果您可以在实体上实施界面
public interface ISelectable
{
string Name { get; }
int Id { get; }
}
public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> collection)
where T: ISelectable
{
return collection.Select(m => new SelectListItem
{
Text = m.Name,
Value = m.Id.ToString()
}).ToList();
}
使用代理
public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> collection, Func<T, string> nameGetter, Func<T, int> idGetter)
{
return collection.Select(m => new SelectListItem
{
Text = nameGetter(m),
Value = idGetter(m).ToString()
}).ToList();
}
用法:
m.EmploymentStatus.ToSelectItemList(e => e.Name, e => e.Id);
第二个选项使用起来比较冗长,但是您可以获得更大的灵活性,因为您不必使用无用的接口实现来混淆数据模型,并且您可以自由地使用{{1}的任何属性名称}或Name
答案 2 :(得分:3)
DropDownListFor
需要IEnumerable<SelectListItem>
selectList作为集合
已经有了一个课程,即SelectList
:
var selectListItems = new SelectList(items, "Id", "Name");
无需任何新的扩展方法。我认为SelectList()
也有一个带有键/值成员表达式的重载而不是字符串,但我可能已经找到了其他地方。