处理选择列表
我得到了一个定义为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));
这似乎并不是最佳解决方案。我应该怎么做?
猜测,答案是我已经用最好的解。
JG,
好笑enogh,我必须寻找这样一个解决方案时,采购了类似的文章。我有一个去的分机方法:
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的等等来搜索它。
适合我。
我真的很喜欢这种方法。我做了一个更改以添加选定的项目参数。
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-10 20:07:51
@jim - 太近了! – 2011-05-10 20:28:06
这似乎是一个非常好的通用解决方案来构建选择列表 – hunter 2011-05-10 12:59:49
它的工作原理,但必须有一个更直接的方式来做到这一点与MVC?如果不是,那么'Html.SelectListFor'的目的是什么? – jgauffin 2011-05-10 13:39:33
“不想在我的控制器中添加视图特定的逻辑” - 等等,这不是控制器的主要责任吗?为视图组装数据? – jfar 2011-05-10 15:03:36