如何将枚举的值获取到SelectList中


71

想象一下,我有一个这样的枚举(仅作为示例):

public enum Direction{
    Horizontal = 0,
    Vertical = 1,
    Diagonal = 2
}

考虑到枚举的内容将来可能会更改,我该如何编写例程以将这些值获取到System.Web.Mvc.SelectList中?我想将每个枚举名称作为选项文本,并将其值作为值文本,如下所示:

<select>
    <option value="0">Horizontal</option>
    <option value="1">Vertical</option>
    <option value="2">Diagonal</option>
</select>

到目前为止,这是我能想到的最好的方法:

 public static SelectList GetDirectionSelectList()
 {
    Array values = Enum.GetValues(typeof(Direction));
    List<ListItem> items = new List<ListItem>(values.Length);

    foreach (var i in values)
    {
        items.Add(new ListItem
        {
            Text = Enum.GetName(typeof(Direction), i),
            Value = i.ToString()
        });
    }

    return new SelectList(items);
 }

但是,这始终将选项文本呈现为“ System.Web.Mvc.ListItem”。通过此调试还向我显示Enum.GetValues()返回的是“ Horizo​​ntal,Vertical”等,而不是我所期望的0、1,这使我想知道Enum.GetName()和Enum之间的区别是什么。 GetValue()。


Answers:


28

要获取枚举的值,您需要将枚举转换为其基础类型:

Value = ((int)i).ToString();

谢谢!我考虑过这一点,但认为可能有一种无需铸造的方法。
李D

87

自从我不得不这样做以来已经有一段时间了,但是我认为这应该可行。

var directions = from Direction d in Enum.GetValues(typeof(Direction))
           select new { ID = (int)d, Name = d.ToString() };
return new SelectList(directions , "ID", "Name", someSelectedValue);

5
几乎可以工作,只需要一点改动!当OP希望它为整数时,您的代码会将值设置为Text。容易修复。更改ID = dID = (int)d。感谢您发布此信息,我从未想过!
克里斯,2010年

很好的答案,尽管我发现要预先填充下拉列表,该值必须是枚举的文本表示形式,而不是整数。
路加·阿德顿


33

这是我刚刚制作的,我个人认为它很性感:

 public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
        {
            return (Enum.GetValues(typeof(T)).Cast<T>().Select(
                enu => new SelectListItem() { Text = enu.ToString(), Value = enu.ToString() })).ToList();
        }

我最终将做一些翻译工作,因此Value = enu.ToString()将调用某个地方的东西。


1
我对此代码有疑问。SelectList的“值”与“文本”相同。当将Enums与EntityFramework一起使用时,保存回数据库的值必须为int。
Northstrider

好的,那么就可以这样做:Value =(int)enu

上面的示例中的(int)enu无效的原因是因为SelectListItem的Value属性是一个字符串,而不是整数。((int)enu).ToString()将起作用。
Teppic

不,不会。在上面的示例中,在编译时它不知道的类型T。因此,您不能int像那样。
ajbeaven

从C#7.3开始,您现在可以添加'where T:System.Enum'。
约翰·梅斯

24

我想做一些与Dann解决方案非常相似的事情,但是我需要将Value用作int并将文本作为Enum的字符串表示。这是我想出的:

public static IEnumerable<SelectListItem> GetEnumSelectList<T>()
    {
        return (Enum.GetValues(typeof(T)).Cast<int>().Select(e => new SelectListItem() { Text = Enum.GetName(typeof(T), e), Value = e.ToString() })).ToList();
    }

1
到目前为止,这是更好的答案。值必须是枚举的int表示形式。
Fahad Abid Janjua,2016年

12

在ASP.NET Core MVC中,这是通过标记帮助器完成的。

<select asp-items="Html.GetEnumSelectList<Direction>()"></select>

如何在加载时设置选定的一个?
JordanGW

然后,您需要指定asp-for属性。
弗雷德

4

也许不是这个问题的确切答案,但是在CRUD场景中,我通常会执行以下操作:

private void PopulateViewdata4Selectlists(ImportJob job)
{
   ViewData["Fetcher"] = from ImportFetcher d in Enum.GetValues(typeof(ImportFetcher))
                              select new SelectListItem
                              {
                                  Value = ((int)d).ToString(),
                                  Text = d.ToString(),
                                  Selected = job.Fetcher == d
                              };
}

PopulateViewdata4Selectlists 在View(“ Create”)和View(“ Edit”)之前,然后在View中调用:

<%= Html.DropDownList("Fetcher") %>

就这样..


4

要么:

foreach (string item in Enum.GetNames(typeof(MyEnum)))
{
    myDropDownList.Items.Add(new ListItem(item, ((int)((MyEnum)Enum.Parse(typeof(MyEnum), item))).ToString()));
}

4
return
            Enum
            .GetNames(typeof(ReceptionNumberType))
            .Where(i => (ReceptionNumberType)(Enum.Parse(typeof(ReceptionNumberType), i.ToString())) < ReceptionNumberType.MCI)
            .Select(i => new
            {
                description = i,
                value = (Enum.Parse(typeof(ReceptionNumberType), i.ToString()))
            });

3
    public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
        //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() };

        return new SelectList(values, "ID", "Name", enumObj);
    }
    public static SelectList ToSelectList<TEnum>(this TEnum enumObj, string selectedValue) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };
        //var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { ID = e, Name = e.ToString() };
        if (string.IsNullOrWhiteSpace(selectedValue))
        {
            return new SelectList(values, "ID", "Name", enumObj);
        }
        else
        {
            return new SelectList(values, "ID", "Name", selectedValue);
        }
    }

3

我有很多枚举选择列表,经过大量的筛选和筛选后,发现创建通用帮手对我而言最有效。它返回索引或描述符作为Selectlist值,并返回Description作为Selectlist文本:

枚举:

public enum Your_Enum
{
    [Description("Description 1")]
    item_one,
    [Description("Description 2")]
    item_two
}

帮手:

public static class Selectlists
{
    public static SelectList EnumSelectlist<TEnum>(bool indexed = false) where TEnum : struct
    {
        return new SelectList(Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(item => new SelectListItem
        {
            Text = GetEnumDescription(item as Enum),
            Value = indexed ? Convert.ToInt32(item).ToString() : item.ToString()
        }).ToList(), "Value", "Text");
    }

    // NOTE: returns Descriptor if there is no Description
    private static string GetEnumDescription(Enum 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();
    }
}

用法: 将参数设置为“ true”以将索引作为值:

var descriptorsAsValue = Selectlists.EnumSelectlist<Your_Enum>();
var indicesAsValue = Selectlists.EnumSelectlist<Your_Enum>(true);

2

由于各种原因,我有更多的类和方法:

枚举项目集合

public static class EnumHelper
{
    public static List<ItemDto> EnumToCollection<T>()
    {
        return (Enum.GetValues(typeof(T)).Cast<int>().Select(
            e => new ItemViewModel
                     {
                         IntKey = e,
                         Value = Enum.GetName(typeof(T), e)
                     })).ToList();
    }
}

在Controller中创建选择列表

int selectedValue = 1; // resolved from anywhere
ViewBag.Currency = new SelectList(EnumHelper.EnumToCollection<Currency>(), "Key", "Value", selectedValue);

MyView.cshtml

@Html.DropDownListFor(x => x.Currency, null, htmlAttributes: new { @class = "form-control" })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.