2011-07-08 7 views
3

イムを削除上記のコードを見ることができます(htmlhelper内)は本当に本当に醜いですが、HTMLヘルパーのためのより美しい方法(コード内)を知っている人ですか?のC#MVC HTMLヘルパー+表現+次の構文でのIListからDropDownListコントロールを作成しようとしてuglyness

ありがとうございます。

+0

なぜあなたはそれが醜いと思いますか? –

+0

Filipご回答いただきありがとうございます。私のコードを調べましたか? Imはlinqで最初のものを選んでハードコードし、次に名前もlist.AsQueryable()で選択してforループをハードコーディングして、すてきな表現をしてはいけませんか? – daanl

+0

Jonが答えを投稿したとき、あなたは今何を意味しているのか分かります。私はちょうどあなたのコードが読めるので、それは醜いではないと思うと思う。たぶんそれは最適化されていませんが、醜くはありません。 –

答えて

4

あなたはこのような後ですか?

public static IHtmlString DropDowntListFor<TModel> 
    (this HtmlHelper htmlHelper, IList<TModel> list, 
    Expression<Func<TModel, string>> valueSelector, 
    Expression<Func<TModel, string>> textSelector) 
{ 
    var dropdownName = valueSelector.Parameters.First().Name; 

    Func<TModel, string> compiledValueSelector = valueSelector.Compile(); 
    Func<TModel, string> compiledTextSelector = textSelector.Compile(); 

    var selectedListItem = list.Select(x => new SelectListItem { 
              Value = compiledValueSelector(x), 
              Text = compiledTextSelector(x) }) 
           .ToList(); 

    return htmlHelper.DropDownList(dropdownName, selectedListItem); 
} 

あなたは式ツリーとしてテキストセレクタを必要としない場合、あなたは少しそれをさらに簡素化できることに注意してください:以下程度

public static IHtmlString DropDowntListFor<TModel> 
    (this HtmlHelper htmlHelper, IList<TModel> list, 
    Expression<Func<TModel, string>> valueSelectorExpression, 
    Func<TModel, string> textSelector) 
{ 
    var dropdownName = valueSelector.Parameters.First().Name; 

    var valueSelector = valueSelectorExpression.Compile(); 

    var selectedListItem = list.Select(x => new SelectListItem { 
              Value = valueSelector(x), 
              Text = textSelector(x) }) 
           .ToList(); 

    return htmlHelper.DropDownList(dropdownName, selectedListItem); 
} 
+0

実際、それはそれほど醜い感謝をするだろう! – daanl

0

方法:

@Html.DropDowntListForVisitingAddress(x => x.Id, x => x.Name) 

とあなたのビューはすでに一部のモデルに強く型付けされているため、HtmlHelperは既に強く型付けされています。>これを使用してモデルを取得します:

public static IHtmlString DropDowntListForVisitingAddress(
    this HtmlHelper<MyViewModel> html, 
    Func<VisitingAddress, string> value, 
    Func<VisitingAddress, string> text 
) 
{ 
    MyViewModel model = html.ViewData.Model; 
    var values = model.VisitingAddresses.Select(x => new SelectListItem 
    { 
     Value = value(x), 
     Text = text(x) 
    }); 
    var selectList = new SelectList(values, "Value", "Text"); 
    return html.DropDownListFor(
     x => x.SelectedAddress, 
     selectList 
    ); 
} 
+1

そして私が持っている他の20のモデルはどうですか? – daanl

+0

@ daanlで、共通のインタフェースまたはベースビューモデルを実装します。 20の他のビューモデルでこのロジックを繰り返さないことを願っています。 –

+1

ImビューモデルにHtmlヘルパーを実装しない – daanl

関連する問題