处理选择列表

时间:2011-05-10 12:51:41

标签: c# asp.net-mvc asp.net-mvc-3 selectlist

我得到了一个定义为IEnumerable<MyViewModel>的模型,我试图用它来创建一个选择列表(Html.SelectListFor)。但我无法弄清楚如何做到这一点。这使我看到了简单的Html.SelectList方法。

由于它需要IEnumerable<SelectListITem>并且我不想在我的控制器或逻辑中添加视图特定逻辑,因此我最终创建了以下扩展方法:

public static class ExtensionMethods
{
    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> items, Func<T, string> valueSelector, Func<T, string> textSelector)
    {
        return items.Select(item => new SelectListItem
                                        {
                                            Text = textSelector(item),
                                            Value = valueSelector(item)
                                        }).ToList();
    }

}

我用作:

@Html.DropDownList("trainid", Model.ToSelectList(item => item.Id, item => item.Name));

这似乎不是最佳解决方案。我该怎么做?

3 个答案:

答案 0 :(得分:1)

猜猜答案是我已经在使用最佳解决方案了。

答案 1 :(得分:0)

JG,

有趣的是,在寻找像这样的解决方案时,我必须找到类似的文章。我有一个绝对的方法:

public static IList<SelectListItem> ToSelectItemList<T>(
    this IEnumerable<T> list, 
    Func<T, string> textSelector, 
    Func<T, string> valueSelector, T selected) where T : class
{
    var results = new List<SelectListItem>();
    if (list != null)
    {
        results.AddRange(
            list.Select(item => new SelectListItem
            {
                Text = textSelector.Invoke(item), 
                Value = valueSelector.Invoke(item), 
                Selected = selected != null ? selected.Equals(item) : false
            }));
    }
     return results;
}

并被调用为:

<%: Html.DropDownList("Base.EntityRootID", Model.EntityRootList.ToSelectItemList(foo => foo.EntityName, foo => foo.ID.ToString(), Model.Base.EntityRoot))%>
有点奇怪。我实际上喜欢这种方法,因为它既是通用的,也可以通过使用实体本身来比较所选项目,意味着你不需要比较id等等。

适合我。

答案 2 :(得分:0)

我真的很喜欢这种方法。我做了一个更改来添加一个选定的项目参数。

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> items, Func<T, string> value, Func<T, string> text, object selectedValue)
    {
        return items.Select(item => new SelectListItem
                                     {
                                         Text = text(item),
                                         Value = value(item),
                                         Selected = (selectedValue.ToString() == value(item))
                                     });
    }

此外,我能够将此代码与Html.DropDownListFor一起使用,这完全消除了对魔术字符串的需求:

Html.DropDownListFor(x => x.ContractId, Model.Contracts.ToSelectList(x => x.Value, x => x.Disp, Model.ContractId))