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

Guess that the answer is that I'm already using the best solution.

于 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

私はこのアプローチがとても好きです。選択したアイテムのパラメーターを追加するために 1 つの変更を加えました。

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 に答える