Есть несколько полезных методов расширения для использования отображения перечислений в выпадающих списках. Например, here и here.MVC3 EnumDropdownList выбранное значение
Но есть одна проблема, с которой я сталкиваюсь, что эти помощники не работают, если перечисление украшено атрибутом Description. Первый пример отлично работает с атрибутом Description, но он не устанавливает выбранное значение. Второй пример устанавливает выбранное значение, но он не использует атрибут описания. Поэтому мне нужно объединить оба метода в рабочий помощник, который делает оба правильно. У меня есть много вариантов, чтобы заставить его работать, но пока ничего не получилось. Я пробовал несколько способов создания selectlist, но почему-то игнорирует свойство Selected. Во всех моих тестах свойство Selected было установлено как true для одного элемента, но это свойство просто игнорируется. Так что любые идеи приветствуются!
Это последний код, который я пробовал:
public static IEnumerable<SelectListItem> ToSelectList(Type enumType, string selectedItem)
{
List<SelectListItem> items = new List<SelectListItem>();
foreach (var item in Enum.GetValues(enumType))
{
FieldInfo fi = enumType.GetField(item.ToString());
var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
var title = attribute == null ? item.ToString() : ((DescriptionAttribute)attribute).Description;
var listItem = new SelectListItem
{
Value = ((int)item).ToString(),
Text = title,
Selected = selectedItem == item.ToString()
};
items.Add(listItem);
}
return items;
}
public static HtmlString EnumDropDownList2For<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> modelExpression)
{
var typeOfProperty = modelExpression.ReturnType;
if (!typeOfProperty.IsEnum)
throw new ArgumentException(string.Format("Type {0} is not an enum", typeOfProperty));
var value = htmlHelper.ViewData.Model == null
? default(TProperty)
: modelExpression.Compile()(htmlHelper.ViewData.Model);
return htmlHelper.DropDownListFor(modelExpression, ToSelectList(modelExpression.ReturnType, value.ToString()));
}
jsut Дополнительная информация: http://coding-in.net/asp-net-mvc-3-method-extension/ – mbowles