それは間違っている。null 可能であるべきは TimeList ではなく、選択された項目を格納することになっている TimePlan プロパティです。ビューモデルに必要なものは次のとおりです。
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...")