Wie fülle ich eine Dropdown-Liste mit Enum-Werten?

8

Ich habe eine enum für eine der Eigenschaften meines View-Modells. Ich möchte eine Dropdown-Liste anzeigen, die alle Werte der Aufzählung enthält. Ich kann dies mit dem folgenden Code arbeiten.

Ich frage mich, ob es eine einfache Möglichkeit gibt, von einem Enum zu einem IEnumerable zu konvertieren? Ich kann es manuell wie im folgenden Beispiel tun, aber wenn ich einen neuen Enum-Wert hinzufüge, bricht der Code. Ich stelle mir vor, dass ich es durch Reflexion tun kann, wie in diesem Beispiel , aber gibt es andere Möglichkeiten, dies zu tun?

%Vor%     
yamspog 14.09.2010, 00:17
quelle

5 Antworten

18

Ich benutze einen Helfer, den ich gefunden habe hier , um meine SelectLists mit einem generischen Enum-Typ zu füllen, habe ich ein wenig modifiziert, um den ausgewählten Wert hinzuzufügen, so sieht es nun aus:

%Vor%

Das Schöne daran ist, dass das DisplayAttribute als Titel und nicht als Name der Enumeration gelesen wird. (Wenn Ihre Enums Leerzeichen enthalten oder Sie eine Lokalisierung benötigen, erleichtert dies Ihr Leben).

Sie müssen also die Anzeige attirubete wie folgt zu Ihren enums hinzufügen:

%Vor%

und so verwenden Sie sie in Ihren Ansichten.

%Vor%

Model.statusType ist nur ein Enum-Objekt vom Typ User_Status .

Das ist es, nicht mehr SelectLists in Ihren ViewModels. In meinem Beispiel referenziere ich ein Enum in meinem ViewModel, aber Sie können den Enum-Typ direkt in Ihrer Ansicht referenzieren. Ich mache es nur, um alles sauber und nett zu machen.

Ich hoffe, das war hilfreich.

    
Manaf Abu.Rous 14.09.2010, 00:36
quelle
2

Siehe Enum.GetNames (typeof (Währungen))

    
Oleg D. 14.09.2010 00:25
quelle
1

So viele gute Antworten - ich dachte, ich würde meine Lösung hinzufügen - Ich baue die SelectList in der Ansicht (und nicht in der Steuerung):

In meiner c #:

%Vor%

In meinem cshtml:

%Vor%

HTH

    
Luchian 06.03.2012 20:34
quelle
1

Ich bin sehr spät dran, aber ich habe gerade einen wirklich coolen Weg gefunden, dies mit einer Codezeile zu tun, wenn Sie die Unconstrained Melody NuGet-Paket (eine nette, kleine Bibliothek von Jon Skeet).

Diese Lösung ist besser, weil:

  1. Es stellt sicher (mit generischen Typ-Constraints), dass der Wert wirklich ein Enum-Wert ist (wegen Unconstrained Melody)
  2. Es vermeidet unnötiges Boxen (wegen Unconstrained Melody)
  3. Es speichert alle Beschreibungen zwischen, um Reflektionen bei jedem Anruf zu vermeiden (wegen Unconstrained Melody)
  4. Es ist weniger Code als die anderen Lösungen!

Also, hier sind die Schritte, um das zu erreichen:

  1. In der Package Manager-Konsole "Install-Package UnconstrainedMelody"
  2. Fügen Sie Ihrem Modell eine Eigenschaft wie folgt hinzu:

    %Vor%

Jetzt, da Sie die List of SelectListItem in Ihrem Modell verfügbar gemacht haben, können Sie @Html.DropDownList oder @ Html.DropDownListFor verwenden, wenn Sie diese Eigenschaft als Quelle verwenden.

    
nootn 04.02.2013 11:03
quelle
0

Vielleicht ist es zu spät, aber ich denke, es könnte für Menschen mit dem gleichen Problem nützlich sein. Ich habe hier gefunden, dass jetzt mit MVC 5 ein EnumDropDownListFor enthalten ist HTML-Helfer, der nicht mehr die Verwendung von benutzerdefinierten Helfern oder anderen Problemumgehungen erfordert.

Fügen Sie in diesem speziellen Fall einfach Folgendes hinzu:

%Vor%

und das ist alles!

Sie können den angezeigten Text auch über Datenanmerkungen und Ressourcendateien übersetzen oder ändern:

  1. Fügen Sie Ihrer Enumeration folgende Datenanmerkungen hinzu:

    %Vor%
  2. Erstellen Sie die entsprechende Ressourcendatei.

redcap 22.07.2015 10:50
quelle