web-dev-qa-db-fra.com

Comment puis-je convertir une énumération en une liste <SelectListItem>?

j'ai une page Web asp.net-mvc et je veux afficher une liste déroulante basée sur une énumération. Je veux montrer le texte de chaque élément d'énumération et l'id étant la valeur int à laquelle l'énumération est associée. Existe-t-il une manière élégante de faire cette conversion?

63
leora

Vous pouvez utiliser LINQ:

Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
    Text = v.ToString(),
    Value = ((int)v).ToString()
}).ToList();
120
SLaks

Depuis MVC 5.1, la manière la plus élégante serait d'utiliser la méthode EnumDropDownListFor de l'assistant Html si vous devez remplir les options select dans votre vue:

@Html.EnumDropDownListFor(m => m.MyEnumProperty,new { @class="form-control"})

ou GetSelectList méthode d'EnumHelper dans votre contrôleur:

var enumList = EnumHelper.GetSelectList(typeof (MyEnum));
25
Maksim Vi.

J'ai fait cela en utilisant une méthode statique que je pouvais réutiliser.

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

Vous pouvez utiliser Enum.GetNames() pour obtenir un tableau de chaînes contenant les noms des éléments enum. Si les noms de vos articles sont conviviaux, c'est probablement suffisant. Sinon, vous pourriez créer votre propre méthode GetName() qui retournerait un joli nom pour chaque élément.

OU - si l'énumération ne changera jamais (ou rarement), vous pouvez simplement créer une méthode qui ajoute directement des éléments codés en dur à votre liste déroulante. C'est probablement plus efficace (si cela est important pour vous).

4
Ray

Maintenant, j'ai utilisé Tuple<string, string> mais vous pouvez le convertir pour utiliser n'importe quoi:

var values = Enum.GetValues(typeof(DayOfWeek))
    .Cast<DayOfWeek>()
    .Select(d => Tuple.Create(((int)d).ToString(), d.ToString()))
    .ToList()
2
ChaosPandion

J'ai utilisé GetEnumSelectList de la classe Html Helper

<select asp-for="MyProperty" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()" ></select>
1
Rubanov