MajoBの回答を参照してください。
ヘルパーを使用している場合でも@Html.DropDownListFor()
、optionLabelArgumentを使用してId0行を指定することもできます。
public static MvcHtmlString DropDownListFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
IEnumerable<SelectListItem> selectList,
string optionLabel
)
アップデート:
MajoBの例が機能しない理由は、Linqクエリで匿名型を使用しているが、.Insert()
ステートメントで文字列を定義しているためだと思います。
.Insert()
ステートメントのLINQクエリで使用されたものと同じ匿名型を再利用することはできないと思います。
したがって、通常のタイプを使用する必要があります。
(from x in
(from li in dContext.states
where li.state >= 0
select new {
value = li.state,
text = li.something
}).AsEnumerable()
select new SelectListeItem {
Value = x.value.ToString()
Text = x.text
}).ToList().Insert(0, new SelectListItem() { .. });
.ToString()
はSQLに変換できないため、ネストされたクエリが必要です。この.AsEnumerable()
呼び出しにより、動作するメモリ内リストが作成されまし.ToString
た。
私は実際にコードベースでこのようなExtensionメソッドを使用しています。ただし、 LinqKitが機能する必要があります。
public static IList<SelectListItem> ToSelectList<T>(this IQueryable<T> query
, Expression<Func<T, long>> value
, Expression<Func<T, string>> text
, string nullText = null)
{
var result = (from x in
(from y in query.AsExpandable()
select new
{
Value = value.Invoke(y),
Text = text.Invoke(y),
}).AsEnumerable()
select new SelectListItem
{
Value = x.Value.ToString(),
Text = x.Text.ToString()
}).ToList();
AddNullText(nullText, result);
return result;
}
private static void AddNullText(string nullText, List<SelectListItem> result)
{
if (nullText != null)
{
result.Insert(0, new SelectListItem()
{
Value = "",
Text = nullText,
});
}
}
(+ Expression<Func<T, string>>
2番目のパラメーターとしてなどを使用した同じ拡張メソッド。)