5

ドロップダウンリストのように、インターフェイスコントロールとして表示する必要のあるドメインオブジェクトがある場合、ifwdevは、.ToSelectList()を追加するための拡張メソッドを作成することを提案しました。

元のオブジェクトは、ドロップダウンリストの.Textプロパティおよび.Valueプロパティと同じプロパティを持つオブジェクトのリストです。基本的に、これはSelectListオブジェクトのリストであり、同じクラス名ではありません。

リフレクションを使用して、ドメインオブジェクトをインターフェイスオブジェクトに変えることができると思います。誰かがこれを行うことができるC#コードの提案がありますか?SelectListは、SelectListItemのMVCドロップダウンリストです。

もちろん、アイデアはビューで次のようなことを行うことです。

<%= Html.DropDownList("City", 
         (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList() )
4

2 に答える 2

4

これらは、選択リストを作成するために使用する2つの拡張方法です。

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value)
{
    return collection.ToSelectList(text, value, x => false);
}

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value, Func<T, bool> selected)
{
    return (from item in collection
            select new SelectListItem()
                       {
                           Text = text(item),
                           Value = value(item),
                           Selected = selected(item)
                       });
}

HTH、
チャールズ

于 2010-04-06T22:20:26.843 に答える
4

オブジェクトのSelectList一部を作成する方が簡単です。ViewModel

とにかく、ループして各アイテムを新しいオブジェクトIEnumerableに追加し、それを返すだけです。SelectList

public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
{ 
    var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
    return items; 
} 

これらの 2 つの類似したメソッドを 1 つにリファクタリングする方法は?

于 2010-04-06T21:51:53.390 に答える