我跟隨this blog可以從ViewModels中需要的幾個枚舉創建DropDownLists。如何添加 - 從DropDownList中選擇一些東西 - 從枚舉中創建
到目前爲止,我的代碼看起來像這樣:
public static class HtmlDropDownExtensions
{
private static readonly SelectListItem [] SingleEmptyItem = new[]{new SelectListItem{Text = string.Empty, Value = string.Empty}};
public static MvcHtmlString EnumDropDownList<TEnum>(this HtmlHelper htmlHelper, string modelPropertyName, TEnum selectedValue)
{
Type baseEnumType = Enum.GetUnderlyingType(typeof(TEnum));
IEnumerable<TEnum> values = Enum.GetValues(typeof (TEnum)).Cast<TEnum>();
IEnumerable<SelectListItem> items = GetSelectListItems(values, selectedValue, baseEnumType);
return htmlHelper.DropDownList(modelPropertyName, items);
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Type enumType = GetNonNullableModelType(metadata);
Type baseEnumType = Enum.GetUnderlyingType(enumType);
IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();
IEnumerable<SelectListItem> items = GetSelectListItems(values, metadata.Model, baseEnumType);
if (metadata.IsNullableValueType)
items = SingleEmptyItem.Concat(items);
return htmlHelper.DropDownListFor(expression, items);
}
private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
Type realModelType = modelMetadata.ModelType;
Type underlyingType = Nullable.GetUnderlyingType(realModelType);
if(underlyingType != null)
realModelType = underlyingType;
return realModelType;
}
private static IEnumerable<SelectListItem> GetSelectListItems<TEnum>(IEnumerable<TEnum> values, object selectedValue, Type underlyingType)
{
return from value in values
select new SelectListItem
{
Text = value.ToString(),
Value = Convert.ChangeType(value, underlyingType).ToString(),
Selected = (value.Equals(selectedValue))
};
}
}
現在我需要的是能夠有一個提示用戶的第一選擇,以選擇一個選項,是因爲空白或不選擇什麼字段是必需的,並且不能有任何默認值。
更新: 我在想,也許「EnumDropDownList」的方法也可以在創建的DropDownList並返回字符串前加空SelectListItem。我還沒有嘗試過,但我認爲MVC工程將嘗試將其綁定到ViewModel時會出現錯誤,因爲無法將該值解析到ViewModel的枚舉屬性中。
感謝您的幫助。
在列表的開始處插入默認項:dropdownlist.Insert(0,defaultItem); – MrFox
@MFFOX:對不起,糾正我,如果我錯了,但我認爲這隻會在Web窗體解決方案,而不是在MVC之一。 –