4

我得到了一个模型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));

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

4

3 回答 3

1

猜猜答案是我已经在使用最好的解决方案。

于 2011-05-29T08:17:14.670 回答
0

jg,

有趣的是,在寻找这样的解决方案时,我一定是参考了类似的文章。我有一个 extn 方法:

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 等。

为我工作。

于 2011-05-10T19:28:17.327 回答
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))
于 2011-05-10T20:00:43.757 回答