查看 MajoB 的答案。
虽然如果您使用的是@Html.DropDownListFor() Helper,您也可以使用 optionLabelArgument 指定 Id 0 行:
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 将在其中工作。
我实际上在我们的代码库中使用了这样的扩展方法。
但它需要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>>等相同的扩展方法,作为第二个参数。)