イムを削除上記のコードを見ることができます(htmlhelper内)は本当に本当に醜いですが、HTMLヘルパーのためのより美しい方法(コード内)を知っている人ですか?のC#MVC HTMLヘルパー+表現+次の構文でのIListからDropDownListコントロールを作成しようとしてuglyness
ありがとうございます。
イムを削除上記のコードを見ることができます(htmlhelper内)は本当に本当に醜いですが、HTMLヘルパーのためのより美しい方法(コード内)を知っている人ですか?のC#MVC HTMLヘルパー+表現+次の構文でのIListからDropDownListコントロールを作成しようとしてuglyness
ありがとうございます。
あなたはこのような後ですか?
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);
}
実際、それはそれほど醜い感謝をするだろう! – daanl
方法:
@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
);
}
なぜあなたはそれが醜いと思いますか? –
Filipご回答いただきありがとうございます。私のコードを調べましたか? Imはlinqで最初のものを選んでハードコードし、次に名前もlist.AsQueryable()で選択してforループをハードコーディングして、すてきな表現をしてはいけませんか? – daanl
Jonが答えを投稿したとき、あなたは今何を意味しているのか分かります。私はちょうどあなたのコードが読めるので、それは醜いではないと思うと思う。たぶんそれは最適化されていませんが、醜くはありません。 –