Работа с перечислениями в ASP.NET MVC 3

Есть ли разумный способ заставить MVC-леса визуализировать выпадающий список или список для свойств модели, которые являются значениями перечисления?

Пример:

public class MyModel
{
    public Color MyColor { get; set; }
    public Option Options { get; set; }
}

public enum Color
{ 
    None = 0,
    Red = 1,
    Blue = 2, 
    White = 3
}

[Flags]
public enum Option
{ 
    NotSet = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}

Для свойства "Цвет" выпадающее меню было бы неплохо. И для свойства "Параметры", поле со списком или список флажков будет круто.

Есть ли какая-либо поддержка, встроенная в инфраструктуру MVC/инструментарий для этого? В настоящее время Visual Studio просто игнорирует свойства модели перечисляемых типов при создании представления из модели.

Каким будет лучший способ реализовать это?

Ответ 1

Вспомогательный метод

Раскрывающийся список для Enum

Я успешно использовал это в своих проектах.

public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
{
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    Type enumType = GetNonNullableModelType(metadata);
    IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();

    TypeConverter converter = TypeDescriptor.GetConverter(enumType);

    IEnumerable<SelectListItem> items =
        from value in values
        select new SelectListItem
                   {
                       Text = converter.ConvertToString(value), 
                       Value = value.ToString(), 
                       Selected = value.Equals(metadata.Model)
                   };

    if (metadata.IsNullableValueType)
    {
        items = SingleEmptyItem.Concat(items);
    }

    return htmlHelper.DropDownListFor(
        expression,
        items
        );
}

Ответ 2

Отличное решение здесь: Как создать раскрывающийся список из перечисления в ASP.NET MVC?

Для раскрывающегося меню, очевидно, но для других параметров пользовательского интерфейса, которые вы хотите, вы можете использовать коллекцию значений для их создания через циклы.

Не встроен, но довольно легко сделать.