2011-05-10 96 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