通用ToSelectListItem方法

时间:2017-11-28 12:35:32

标签: c# asp.net-mvc linq generics

我在数据库中有大约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();
}

3 个答案:

答案 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()也有一个带有键/值成员表达式的重载而不是字符串,但我可能已经找到了其他地方。

另见ASP.NET MVC Dropdown List From SelectList