2010-08-15 9 views
54

J'ai une page Web asp.net-mvc et je veux montrer une liste déroulante qui est basée sur une énumération. Je souhaite afficher le texte de chaque élément enum et l'identifiant étant la valeur int associée à l'énumération. Y a-t-il une manière élégante de faire cette conversion?Comment convertir une énumération en liste <SelectListItem>?

+0

la réponse par Maksim Vi. devrait vraiment être la bonne réponse. –

Répondre

102

Vous pouvez utiliser LINQ:

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

Bien que * LINQ * soit devenu le nom officieux des Extensions Enumerable, je ne peux m'empêcher de me demander si quelque chose de plus approprié existe. – ChaosPandion

+1

Cela fait partie de l'espace de noms et du projet Linq, et IMO est le nom correct. Linq est juste aussi le nom de l'extension de la langue. – Dykam

+0

ce code ci-dessus ne compile pas. j'essaye de faire ceci: Liste dropdown = Enum.GetValues ​​(typeof (EventType)) .Sélectionnez (v => nouveau SelectListItem { Selected = (int) v == id, Text = v.ToString (), Value = ((int) v) .ToString() }). ToList(); liste déroulante de retour; mais en obtenant une erreur: "Impossible de convertir l'expression de TSource en int" dans les lignes en cours (int) v) – leora

2

Maintenant, j'utilisé Tuple<string, string> mais vous pouvez convertir cette option pour utiliser quoi que ce soit:

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

Vous pouvez utiliser Enum.GetNames() pour obtenir un tableau de chaînes contenant les noms des éléments de ENUM. Si les noms de vos éléments sont conviviaux, c'est probablement assez bon. Sinon, vous pouvez créer votre propre méthode GetName() qui retournera 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 dans votre liste déroulante. C'est probablement plus efficace (si c'est important pour vous).

17

Depuis MVC 5.1, la façon la plus élégante serait d'utiliser EnumDropDownListFor méthode d'aide Html si vous avez besoin pour remplir select options dans votre vue:

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

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

var enumList = EnumHelper.GetSelectList(typeof (MyEnum)); 
+0

gentil, merci! –

+0

Très lisse! Je ne savais pas à ce sujet ... devrait être la bonne réponse. –

+0

wow, je ne savais pas. beaucoup de lignes de code enregistrées pour le moment! Merci mec! –

4

Je l'ai fait en utilisant une méthode statique que je pourrais 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(); 
} 
0

J'utilisé GetEnumSelectList de la classe Html Aide

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