2010-08-15 9 views
54

Ich habe eine asp.net-mvc Webseite und ich möchte eine Dropdown-Liste, die auf einem Enum basiert. Ich möchte den Text jedes Aufzählungselements und die ID anzeigen, die der Int-Wert ist, mit dem die Aufzählung verknüpft ist. Gibt es eine elegante Möglichkeit, diese Konvertierung durchzuführen?Wie kann ich eine Aufzählung in eine Liste <SelectListItem> konvertieren?

+0

die Antwort von Maksim Vi. sollte wirklich die richtige Antwort sein. –

Antwort

102

Sie können LINQ verwenden:

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

Obwohl * LINQ * zum inoffiziellen Namen der Enumerable Extensions geworden ist, kann ich nicht anders, als mich zu fragen, ob etwas Angemesseneres existiert. – ChaosPandion

+1

Es ist Teil des Linq Namespace und Projekt und IMO der richtige Name. Linq ist nur der Name für die Spracherweiterung. – Dykam

+0

Dieser Code oben kompiliert nicht. Ich versuche dies zu tun: List dropdown = Enum.GetValues ​​(typeof (EventType)). Wählen Sie (v => new SelectListItem { Ausgewählt = (int) v == id, Text = v.ToString (), Wert = ((int) v) .ToString() }). ToList(); Rückkehr Dropdown; aber erhalten einen Fehler: "Kann Ausdruck nicht von TSource zu int" in den Zeilen, die tun (int) v) – leora

2

Jetzt habe ich Tuple<string, string> aber Sie können dies alles verwenden, konvertieren:

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

Sie Enum.GetNames() verwenden können, ein String-Array mit den Namen der Enum Elemente zu erhalten. Wenn Ihre Elementnamen benutzerfreundlich sind, ist dies wahrscheinlich gut genug. Andernfalls können Sie Ihre eigene GetName()-Methode erstellen, die für jedes Element einen schönen Namen zurückgibt.

ODER - wenn sich die Enumeration niemals (oder selten) ändert, können Sie einfach eine Methode erstellen, die Ihrem Dropdown-Menü direkt fest codierte Elemente hinzufügt. Dies ist wahrscheinlich effizienter (wenn Ihnen das wichtig ist).

17

Seit MVC 5.1, die eleganteste Art und Weise wäre EnumDropDownListFor Methode der Html-Helfer zu verwenden, wenn Sie select Optionen in der Ansicht füllen müssen:

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

oder GetSelectList Methode von EnumHelper in Ihrem Controller:

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

netter, danke! –

+0

Sehr glatt! Wusste das nicht ... sollte die richtige Antwort sein. –

+0

wow, ich wusste es nicht. eine Menge Codezeilen für jetzt gespeichert! Danke mann! –

4

Ich tat dies mit einer statischen Methode, die ich wiederverwenden konnte.

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

I verwendet GetEnumSelectList aus der HTML-Helper-Klasse

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