2011-05-10 70 views
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)); 

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

+1

这似乎是一个非常好的通用解决方案来构建选择列表 – hunter 2011-05-10 12:59:49

+0

它的工作原理,但必须有一个更直接的方式来做到这一点与MVC?如果不是,那么'Html.SelectListFor'的目的是什么? – jgauffin 2011-05-10 13:39:33

+0

“不想在我的控制器中添加视图特定的逻辑” - 等等,这不是控制器的主要责任吗?为视图组装数据? – jfar 2011-05-10 15:03:36

回答

1

猜测,答案是我已经用最好的解。

0

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的等等来搜索它。

适合我。

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)) 
+0

几乎一个'快速'罗伯特:) – 2011-05-10 20:07:51

+1

@jim - 太近了! – 2011-05-10 20:28:06