Ich versuche, die Html.DropDownList
Erweiterungsmethode zu verwenden, kann aber nicht herausfinden, wie sie mit einer Aufzählung verwendet wird.
Angenommen, ich habe eine Aufzählung wie diese:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
Wie erstelle ich ein Dropdown-Menü mit diesen Werten mithilfe der Html.DropDownList
Erweiterungsmethode?
Oder ist es meine beste Wahl, einfach eine for-Schleife zu erstellen und die HTML-Elemente manuell zu erstellen?
c#
asp.net
asp.net-mvc
Kevin Pang
quelle
quelle
ASP.NET MVC
einen nativen Weg gibt: stackoverflow.com/a/22295360/1361084Ich weiß, dass ich zu spät zur Party komme, dachte aber, dass Sie diese Variante nützlich finden könnten, da Sie mit dieser auch beschreibende Zeichenfolgen anstelle von Aufzählungskonstanten in der Dropdown-Liste verwenden können. Dekorieren Sie dazu jeden Aufzählungseintrag mit einem Attribut [System.ComponentModel.Description].
Zum Beispiel:
Hier ist mein Code:
Sie können dies dann aus Ihrer Sicht tun:
Hoffe das hilft dir!
** EDIT 2014-JAN-23: Microsoft hat gerade MVC 5.1 veröffentlicht, das jetzt über eine EnumDropDownListFor-Funktion verfügt. Leider scheint das Attribut [Beschreibung] nicht berücksichtigt zu werden, sodass der obige Code weiterhin gültig ist. Siehe Abschnitt " Aufzählung " in den Versionshinweisen von Microsoft für MVC 5.1.
Update: Es unterstützt jedoch das Display- Attribut
[Display(Name = "Sample")]
, sodass man es verwenden kann.[Update - habe dies gerade bemerkt und der Code sieht hier wie eine erweiterte Version des Codes aus: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , mit ein paar ergänzungen . Wenn ja, würde die Zuschreibung fair erscheinen ;-)]
quelle
System.Web.Mvc.Html
, dieserDropDownListFor
nicht gefunden werden kann, aber auch nicht behoben werden kann. Sie müssen manuell tunusing System.Web.Mvc.Html;
. Nur damit du es weißt.In ASP.NET MVC 5.1 wurde der
EnumDropDownListFor()
Helfer hinzugefügt , sodass keine benutzerdefinierten Erweiterungen erforderlich sind:Modell :
Ansicht :
Verwenden des Tag-Hilfsprogramms (ASP.NET MVC 6) :
quelle
Ich stieß auf dasselbe Problem, fand diese Frage und dachte, dass die von Ash bereitgestellte Lösung nicht das war, wonach ich suchte. Das HTML selbst erstellen zu müssen bedeutet weniger Flexibilität im Vergleich zur integrierten
Html.DropDownList()
Funktion.Es stellt sich heraus, dass C # 3 usw. dies ziemlich einfach macht. Ich habe einen
enum
AnrufTaskStatus
:Dadurch wird eine gute alte Version erstellt
SelectList
, die so verwendet werden kann, wie Sie es in der Ansicht gewohnt sind:Der anonyme Typ und LINQ machen dies meiner Meinung nach viel eleganter. Nichts für ungut, Ash. :) :)
quelle
select new { ID = (int)s, Name = s.ToString() };
Hier ist eine besser gekapselte Lösung:
https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5
Sagen Sie hier ist Ihr Modell:
Beispielnutzung:
Generierte Benutzeroberfläche:
Und generiertes HTML
Der Schnappschuss des Quellcodes der Helfererweiterung:
Sie können das Beispielprojekt über den von mir angegebenen Link herunterladen.
EDIT: Hier ist der Code:
quelle
Für Html.DropDownListFor ist nur eine IEnumerable erforderlich. Eine Alternative zur Prise-Lösung lautet daher wie folgt. So können Sie einfach schreiben:
[Wobei SelectedItemType ein Feld in Ihrem Modell vom Typ ItemTypes ist und Ihr Modell nicht null ist]
Außerdem müssen Sie die Erweiterungsmethode nicht wirklich generieren, da Sie enumValue.GetType () anstelle von typeof (T) verwenden können.
BEARBEITEN: Integrierte auch hier Simons Lösung und enthielt die ToDescription-Erweiterungsmethode.
quelle
Also ohne Erweiterungsfunktionen, wenn Sie einfach und unkompliziert suchen. Das habe ich getan
Dabei ist XXXXX.Sites.YYYY.Models.State eine Aufzählung
Wahrscheinlich ist es besser, die Hilfsfunktion auszuführen, aber wenn die Zeit knapp ist, wird dies die Arbeit erledigen.
quelle
Wenn Sie die Antworten von Prize und Rune erweitern möchten, möchten Sie den folgenden Code verwenden, wenn das value-Attribut Ihrer ausgewählten Listenelemente dem ganzzahligen Wert des Aufzählungstyps und nicht dem Zeichenfolgenwert zugeordnet werden soll:
Anstatt jeden Aufzählungswert als TEnum-Objekt zu behandeln, können wir ihn als Objekt behandeln und ihn dann in eine Ganzzahl umwandeln, um den Wert ohne Box zu erhalten.
Hinweis: Ich habe außerdem eine generische Typeinschränkung hinzugefügt, um die Typen, für die diese Erweiterung verfügbar ist, nur für Strukturen (Enums Basistyp) zu beschränken, und eine Laufzeit-Typüberprüfung, die sicherstellt, dass die übergebene Struktur tatsächlich eine Enum ist.
Update 23.10.12: Generischer Typparameter für zugrunde liegenden Typ hinzugefügt und Nichtkompilierungsproblem behoben, das .NET 4+ betrifft.
quelle
ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
Value = Convert.ToInt32(e)
.(int)e
kompiliert nicht. :(Um das Problem zu lösen, dass die Nummer anstelle von Text mithilfe der Erweiterungsmethode von Prise abgerufen wird.
quelle
e
zuint
.ID = Convert.ToInt32(e)
.Ein super einfacher Weg, dies zu erledigen - ohne all das Erweiterungsmaterial, das übertrieben erscheint, ist dies:
Ihre Aufzählung:
Binden Sie die Aufzählung innerhalb Ihres Controllers an eine Liste:
Danach werfen Sie es in eine ViewBag:
Zum Schluss binden Sie es einfach an die Ansicht:
Dies ist bei weitem der einfachste Weg, den ich gefunden habe, und erfordert keine Erweiterungen oder etwas so Verrücktes.
UPDATE : Siehe Andrews Kommentar unten.
quelle
Level1 = 1
getan hätten , wäre der Wert der Dropdown-Liste"Level1"
anstelle von1
.Die beste Lösung, die ich dafür gefunden habe, war die Kombination dieses Blogs mit der Antwort von Simon Goldstone .
Dies ermöglicht die Verwendung der Aufzählung im Modell. Im Wesentlichen besteht die Idee darin, eine Ganzzahl-Eigenschaft sowie die Aufzählung zu verwenden und die Ganzzahl-Eigenschaft zu emulieren.
Verwenden Sie dann das Attribut [System.ComponentModel.Description], um das Modell mit Ihrem Anzeigetext zu versehen, und verwenden Sie in Ihrer Ansicht die Erweiterung "EnumDropDownListFor".
Dies macht sowohl die Ansicht als auch das Modell sehr lesbar und wartbar.
Modell:
Aussicht:
Erweiterung (der Vollständigkeit halber direkt aus der Antwort von Simon Goldstone ):
quelle
Sie möchten etwas wie verwenden
Enum.GetValues
quelle
quelle
Dies sind Rune & Prize-Antworten, die geändert wurden, um den Enum-
int
Wert als ID zu verwenden.Beispielaufzählung:
Verlängerungsmethode:
Verwendungsbeispiel:
Denken Sie daran, den Namespace zu importieren, der die Erweiterungsmethode enthält
Beispiel für generiertes HTML:
Beachten Sie, dass das Element, mit dem Sie das Ein aufrufen,
ToSelectList
das ausgewählte Element ist.quelle
Id = Convert.ToInt32(e)
.Dies ist die Version für Razor:
quelle
In .NET Core können Sie Folgendes verwenden:
quelle
<select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
.Jetzt wird diese Funktion in MVC 5.1 bis sofort unterstützt
@Html.EnumDropDownListFor()
Überprüfen Sie den folgenden Link:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum
Es ist wirklich schade, dass Microsoft 5 Jahre gebraucht hat, um eine solche Funktion zu implementieren, die laut obiger Abstimmung so gefragt ist!
quelle
Aufbauend auf Simons Antwort besteht ein ähnlicher Ansatz darin, die Enum-Werte aus einer Ressourcendatei anzuzeigen, anstatt in einem Beschreibungsattribut innerhalb der Enum selbst. Dies ist hilfreich, wenn Ihre Site in mehr als einer Sprache gerendert werden muss und wenn Sie eine bestimmte Ressourcendatei für Enums haben möchten, können Sie einen Schritt weiter gehen und nur Enum-Werte in Ihrer Enum haben und auf diese aus der Erweiterung von verweisen eine Konvention wie [EnumName] _ [EnumValue] - letztendlich weniger Tippen!
Die Erweiterung sieht dann so aus:
Ressourcen in der Enums.Resx-Datei, die wie ItemTypes_Movie: Film aussehen
Eine andere Sache, die ich gerne mache, ist, anstatt die Erweiterungsmethode direkt aufzurufen, sie lieber mit einem @ Html.EditorFor (x => x.MyProperty) aufzurufen oder im Idealfall nur die gesamte Form in einem ordentlichen @ zu haben Html.EditorForModel (). Dazu ändere ich die Zeichenfolgenvorlage so, dass sie so aussieht
Wenn Sie das interessiert, habe ich hier in meinem Blog eine viel detailliertere Antwort veröffentlicht:
http://paulthecyclist.com/2013/05/24/enum-dropdown/
quelle
Nun, ich bin sehr spät zur Party, aber für das, was es wert ist, habe ich über genau dieses Thema gebloggt, wobei ich eine
EnumHelper
Klasse erstelle , die eine sehr einfache Transformation ermöglicht.http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23
In Ihrem Controller:
Aus Ihrer Sicht:
Die Helferklasse:
quelle
Ich bin sehr spät dran, aber ich habe gerade einen wirklich coolen Weg gefunden, dies mit einer Codezeile zu tun, wenn Sie gerne das Unconstrained Melody NuGet-Paket hinzufügen (eine schöne, kleine Bibliothek von Jon Skeet).
Diese Lösung ist besser, weil:
Hier sind die Schritte, um dies zum Laufen zu bringen:
Fügen Sie Ihrem Modell eine Eigenschaft wie folgt hinzu:
Nachdem Sie die Liste von SelectListItem in Ihrem Modell verfügbar gemacht haben, können Sie @ Html.DropDownList oder @ Html.DropDownListF verwenden, um diese Eigenschaft als Quelle zu verwenden.
quelle
Ein weiterer Fix für diese Erweiterungsmethode: Die aktuelle Version hat den aktuellen Wert der Aufzählung nicht ausgewählt. Ich habe die letzte Zeile repariert:
quelle
Wenn Sie Lokalisierungsunterstützung hinzufügen möchten, ändern Sie einfach die Methode s.toString () wie folgt:
Hier ist der Typ (Ressourcen) die Ressource, die Sie laden möchten, und dann erhalten Sie den lokalisierten String, der auch nützlich ist, wenn Ihr Enumerator Werte mit mehreren Wörtern enthält.
quelle
Dies ist meine Version der Hilfsmethode. Ich benutze das:
Stattdessen:
Hier ist es:
quelle
Sie können auch meine benutzerdefinierten HTML-Helfer in Griffin.MvcContrib verwenden. Der folgende Code:
Erzeugt:
https://github.com/jgauffin/griffin.mvccontrib
quelle
Ich möchte diese Frage auf eine andere Art und Weise beantworten, bei der der Benutzer nichts in
controller
oderLinq
Ausdruck tun muss . Diesen Weg...Ich habe ein
ENUM
Jetzt kann ich einfach ein erstellen
dropdown
indem dies benutzeenum
.ODER
Wenn Sie einen Index auswählen möchten, versuchen Sie dies
Hier habe ich
AccessLevelEnum.NoAccess
als zusätzlichen Parameter für die Standardauswahl der Dropdown-Liste verwendet.quelle
Ich habe hier eine Antwort gefunden . Einige meiner Aufzählungen haben jedoch
[Description(...)]
Attribute, daher habe ich den Code geändert, um dies zu unterstützen:Ich hoffe, das hilft.
quelle
@ Simon Goldstone: Danke für Ihre Lösung, sie kann in meinem Fall perfekt angewendet werden. Das einzige Problem ist, dass ich es in VB übersetzen musste. Aber jetzt ist es geschafft und um die Zeit anderer Leute zu sparen (falls sie es brauchen), habe ich es hier eingefügt:
Ende Du benutzt es so:
quelle
Am Ende habe ich Erweiterungsmethoden entwickelt, um das zu tun, was hier im Wesentlichen die akzeptierte Antwort ist. Die letzte Hälfte des Gist befasst sich speziell mit Enum.
https://gist.github.com/3813767
quelle
quelle
quelle