我得到了一个定义为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));
这似乎不是最佳解决方案。我该怎么做?
答案 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))