你如何从ASP.NET MVC中的枚举创建一个下拉列表?

我试图使用Html.DropDownList扩展方法,但不知道如何使用它与枚举。

比方说,我有这样的枚举:

public enum ItemTypes
{
    Movie = 1,
    Game = 2,
    Book = 3
}

如何使用Html.DropDownList扩展方法来创建带有这些值的下拉菜单?

或者,我最好只是简单地创建一个for循环并手动创建Html元素?


对于MVC v5.1使用Html.EnumDropDownListFor

@Html.EnumDropDownListFor(
    x => x.YourEnumField,
    "Select My Type", 
    new { @class = "form-control" })

对于MVC v5使用EnumHelper

@Html.DropDownList("MyType", 
   EnumHelper.GetSelectList(typeof(MyType)) , 
   "Select My Type", 
   new { @class = "form-control" })

适用于MVC 5及更低版本

我将符文的答案转换为扩展方法:

namespace MyApp.Common
{
    public static class MyExtensions{
        public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
            where TEnum : struct, IComparable, IFormattable, IConvertible
        {
            var values = from TEnum e in Enum.GetValues(typeof(TEnum))
                select new { Id = e, Name = e.ToString() };
            return new SelectList(values, "Id", "Name", enumObj);
        }
    }
}

这允许你写:

ViewData["taskStatus"] = task.Status.ToSelectList();

通过using MyApp.Common


我知道我对这个派对迟到了,但是认为你可能会发现这个变体很有用,因为这个变种还允许你在下拉列表中使用描述性字符串而不是枚举常量。 为此,请使用[System.ComponentModel.Description]属性修饰每个枚举条目。

例如:

public enum TestEnum
{
  [Description("Full test")]
  FullTest,

  [Description("Incomplete or partial test")]
  PartialTest,

  [Description("No test performed")]
  None
}

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Reflection;
using System.ComponentModel;
using System.Linq.Expressions;

 ...

 private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
    {
        Type realModelType = modelMetadata.ModelType;

        Type underlyingType = Nullable.GetUnderlyingType(realModelType);
        if (underlyingType != null)
        {
            realModelType = underlyingType;
        }
        return realModelType;
    }

    private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "", Value = "" } };

    public static string GetEnumDescription<TEnum>(TEnum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if ((attributes != null) && (attributes.Length > 0))
            return attributes[0].Description;
        else
            return value.ToString();
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
    {
        return EnumDropDownListFor(htmlHelper, expression, null);
    }

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

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

        // If the enum is nullable, add an 'empty' item to the collection
        if (metadata.IsNullableValueType)
            items = SingleEmptyItem.Concat(items);

        return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
    }

您可以在您的视图中执行此操作:

@Html.EnumDropDownListFor(model => model.MyEnumProperty)

希望这可以帮助你!

编辑2014年1月23日:微软刚刚发布MVC 5.1,现在有一个EnumDropDownListFor功能。 可悲的是,它似乎没有尊重[Description]属性,所以上面的代码仍然存在。 (有关 Microsoft发行说明, 请参阅http://www.asp.net/mvc/overview/releases/mvc51-release-notes#Enum 。)

更新:尽管它支持Display属性[Display(Name = "Sample")] ,所以可以使用它。

[更新 - 只是注意到了这一点,代码看起来像这里的代码的扩展版本:http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating- a-dropdownlist-helper-for-enums.aspx,并增加了一些内容。 如果是这样,归因会看起来公平;-)]


ASP.NET MVC 5.1中 ,他们添加了EnumDropDownListFor()助手,因此不需要自定义扩展:

模型:

public enum MyEnum
{
    [Display(Name = "First Value - desc..")]
    FirstValue,
    [Display(Name = "Second Value - desc...")]
    SecondValue
}

视图:

@Html.EnumDropDownListFor(model => model.MyEnum)

使用标签助手(ASP.NET MVC 6):

<select asp-for="@Model.SelectedValue" asp-items="Html.GetEnumSelectList<MyEnum>()">
链接地址: http://www.djcxy.com/p/8425.html

上一篇: How do you create a dropdownlist from an enum in ASP.NET MVC?

下一篇: Compile Views in ASP.NET MVC