我最近做了一个扩展,用于将下拉列表绑定到模型, 不幸的是,我无法使-wanna成为默认值 - “请选择...”被选为默认值 始终下拉列表的索引为1,它选择Enum的第1项作为默认项。 我根据this -Darin的好答案进行了扩展 -
我被建议使用可以为空的枚举, 我还不能让它工作,希望得到帮助
帮助程序中默认选择文本的规范:
return htmlHelper.DropDownListFor(expression, items, "Please select ...");
如何在任何下拉列表中选择“请选择...”作为默认设置。
在我使用过的ViewModel中:
public TimePlan? TimeList { get; set; }
答案 0 :(得分:3)
你做错了。不应该是可以为空的TimeList,而是应该存储所选项的TimePlan属性。以下是您在View模型中应该拥有的内容:
public TimePlan? TheTimePlan { get; set; }
public IEnumerable<SelectListItem> TimeList
{
get
{
var enumType = typeof(TimePlan);
var values = Enum.GetValues(enumType).Cast<TimePlan>();
return
from value in values
select new SelectListItem
{
Text = Enum.GetName(typeof(TimePlan), value),
Value = value.ToString(),
};
}
}
然后,在您的视图中,您将拥有:
@Html.DropDownListFor(model => model.TheTimePlan, Model.TimeList, "Please select...")
<强>更新强>
如果你想创建一个自定义的html助手,你可以这样做:
public static IHtmlString DropDownListForEnum<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TEnum>> expression, string optionLabel)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var enumType = GetNonNullableModelType(metadata);
var values = Enum.GetValues(enumType).Cast<TEnum>();
var items =
from value in values
select new SelectListItem
{
Text = Enum.GetName(enumType, value),
Value = value.ToString(),
Selected = value.Equals(metadata.Model)
};
return htmlHelper.DropDownListFor(expression, items, optionLabel);
}
private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
Type modelType = modelMetadata.ModelType;
Type underlyingType = Nullable.GetUnderlyingType(modelType);
if (underlyingType != null)
{
modelType = underlyingType;
}
return modelType;
}
然后,在您的视图中,您将拥有:
@Html.DropDownListForEnum(model => model.TheTimePlan, "Please select...")