Ich habe eine Eigenschaft in meinem Modell namens "Promotion", deren Typ eine Flaggenaufzählung namens "UserPromotion" ist. Mitglieder meiner Aufzählung haben folgende Anzeigeattribute:
[Flags]
public enum UserPromotion
{
None = 0x0,
[Display(Name = "Send Job Offers By Mail")]
SendJobOffersByMail = 0x1,
[Display(Name = "Send Job Offers By Sms")]
SendJobOffersBySms = 0x2,
[Display(Name = "Send Other Stuff By Sms")]
SendPromotionalBySms = 0x4,
[Display(Name = "Send Other Stuff By Mail")]
SendPromotionalByMail = 0x8
}
Jetzt möchte ich in meiner Ansicht beispielsweise eine ul erstellen können, um die ausgewählten Werte meiner Eigenschaft "Promotion" anzuzeigen. Dies ist, was ich bisher getan habe, aber das Problem ist, wie kann ich die Anzeigenamen hier erhalten?
<ul>
@foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
{
var currentPromotion = (int)Model.JobSeeker.Promotion;
if ((currentPromotion & aPromotion) == aPromotion)
{
<li>Here I don't know how to get the display attribute of "currentPromotion".</li>
}
}
</ul>
c#
asp.net-mvc
razor
displayattribute
Pejman
quelle
quelle
System.ComponentModel.DataAnnotations.DisplayAttribute
. NichtSystem.ComponentModel.DisplayNameAttribute
.Antworten:
AKTUALISIEREN
Die erste Lösung konzentrierte sich darauf, Anzeigenamen von enum zu erhalten. Der folgende Code sollte die genaue Lösung für Ihr Problem sein.
Sie können diese Hilfsklasse für Aufzählungen verwenden:
Und dann können Sie es in Ihrer Ansicht wie folgt verwenden:
Ich hoffe es hilft! :) :)
quelle
.ToString
, aber von stackoverflow.com/q/483794/179311 heißt es,Enum.GetName
stattdessen zu verwenden .GetDisplayValue
sollten Sie zuerst testen,descriptionAttributes == null
bevor Sie versuchen, auf das Array zuzugreifen :descriptionAttributes[0]
. Andernfalls können Sie eine Ausnahme auslösen, und die Zeile darunter, in der Sie nach Null suchen, ist niemals wahr.Einzeiler - Fließende Syntax
Beispiel
Ausgabe
quelle
.NET Framework 4.5
und dass Sie die folgenden Namespaces einschließenSystem.Net
System.ComponentModel.DataAnnotations
GetAttribute<TAttribute>
eine schreckliche Namenskonvention? Es ruft das von Ihnen angegebene Attribut ab und verwendet das Pascal-Gehäuse wie alle öffentlichen Methoden.Aufbauend auf Aydins großartiger Antwort finden Sie hier eine Erweiterungsmethode, für die keine Typparameter erforderlich sind.
HINWEIS : GetName () sollte anstelle der Name-Eigenschaft verwendet werden. Dadurch wird sichergestellt, dass die lokalisierte Zeichenfolge zurückgegeben wird, wenn die Attributeigenschaft ResourceType verwendet wird.
Beispiel
Um es zu verwenden, verweisen Sie einfach auf den Aufzählungswert in Ihrer Ansicht.
Ausgabe
Promotion: Stellenangebote per Mail verschicken
quelle
@Html.DisplayFor(m => m.myEnum.GetDisplayName())
dies nicht funktioniert, da erwartet wird, dass der ausgewertete Ausdruck eine Eigenschaft ergibt oder etwas Ähnliches. Sie sollten den nackten Aufzählungswert wie im obigen Beispiel verwenden.GetCustomAttribute<DisplayAttribute>()
da dies für einige Enums möglicherweise nicht vorhanden ist. Es wird darauf zurückgegriffen,enumValue.ToString()
ob das DisplayAttribute nicht vorhanden war.List<SelectListItem>
, die von einer Aufzählung mit allen einzelnenDisplayAttribute.Name
Anmerkungen gefüllt wurde - dies hat perfekt funktioniert, danke !!public List<SelectListItem> MySelectListItem = new List<SelectListItem>(); foreach (MyEnum MyEnum in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Where(x => x != MyEnum.Default)) { MySelectListItem.Add(new SelectListItem() { Text = MyEnum.GetDisplayName(), Value = ((int)MyEnum).ToString() }); }
Basierend auf Aydins Antwort würde ich eine weniger "doppelte" Implementierung vorschlagen (da wir das leicht
Type
aus demEnum
Wert selbst erhalten könnten , anstatt es als Parameter bereitzustellen 😉:BEARBEITEN (basierend auf dem Kommentar von @Vahagn Nahapetyan)
Jetzt können wir es auf diese Weise sehr sauber verwenden:
Was in ... endet
quelle
this
der ein gültiger (nicht null) Enum-Wert angegeben werden muss. Andernfalls würde der Aufruf der Methode bereits auslösen (was in der Verantwortung des aufrufenden Codes liegt). DadurchGetType()
wird mit Sicherheit der richtige Aufzählungstyp bereitgestellt, in dem Sieenumvalue
mit Sicherheit Mitglied sein werden. Da GetCustomAttribute jedoch möglicherweise einen Nullwert zurückgibt, habe ich eine nicht außergewöhnliche Version der Methode bereitgestellt, um Null zurückzugeben, wenn die Kette von Methodenaufrufen irgendwo einen Null-Rückgabewert hat. Vielen Dank!Wenn Sie MVC 5.1 oder höher verwenden, gibt es eine einfachere und klarere Möglichkeit: Verwenden Sie einfach die Datenanmerkung (aus dem
System.ComponentModel.DataAnnotations
Namespace) wie folgt :Und in Sicht, setzen Sie es einfach in den richtigen HTML-Helfer:
quelle
Sie können die Type.GetMember-Methode verwenden und dann die Attributinformationen mithilfe von Reflection abrufen :
Es gab hier einige ähnliche Beiträge:
Attribute des Enum-Werts abrufen
Wie kann MVC3 DisplayFor den Wert des Anzeigeattributs einer Enum anzeigen?
quelle
Aufbauend auf der großartigen Antwort von Todd, die auf der großartigen Antwort von Aydin aufbaut , finden Sie hier eine generische Erweiterungsmethode, für die keine Typparameter erforderlich sind.
Ich brauchte dies für mein Projekt, weil so etwas wie der folgende Code, in dem nicht jedes Mitglied der Enumeration einen hat
DisplayAttribute
, nicht mit der Lösung von Todd funktioniert:Wenn dies eine komplizierte Lösung für ein einfaches Problem ist, lassen Sie es mich bitte wissen, aber dies war die Lösung, die ich verwendet habe.
quelle
quelle
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Ich habe zwei Lösungen für diese Frage.
quelle
Für ASP.Net Core 3.0 hat dies bei mir funktioniert (Gutschrift an frühere Antwortende).
Meine Enum-Klasse:
Meine Ansicht Modellklasse:
Ein Beispiel für eine Rasiereransicht mit einer Beschriftung und einer Dropdown-Liste. Beachten Sie, dass für die Dropdown-Liste keine Hilfsmethode erforderlich ist:
quelle
Sie müssen ein wenig nachdenken, um auf dieses Attribut zugreifen zu können:
Ich empfehle, diese Methode in eine Erweiterungsmethode einzuschließen oder in einem Ansichtsmodell auszuführen.
quelle
Mit Core 2.1,
quelle
Kombinieren aller Randfälle von oben:
Equals
,ToString
)Display
AttributHier ist mein Code:
quelle
Es tut mir leid, dies zu tun, aber ich konnte keine der anderen Antworten so wie sie sind verwenden und habe keine Zeit, sie in den Kommentaren herauszuarbeiten.
Verwendet die C # 6-Syntax.
quelle
Aufbauend auf den Antworten von Aydin und Todd finden Sie hier eine Erweiterungsmethode, mit der Sie auch den Namen aus einer Ressourcendatei abrufen können
und benutze es gerne
quelle
Ich möchte mit der kulturabhängigen Enum-Erweiterung GetDisplayName einen Beitrag leisten. Ich hoffe, dies ist nützlich für alle, die diese Antwort wie ich zuvor googeln:
"Standard" Weg, wie Aydin Adn und Todd erwähnten:
"Kulturabhängiger" Weg:
quelle
2020 Update: Eine aktualisierte Version der Funktion, die von vielen in diesem Thread bereitgestellt wird, jetzt jedoch für C # 7.3:
Jetzt können Sie generische Methoden auf Aufzählungstypen beschränken, sodass Sie eine einzelne Methodenerweiterung schreiben können, um sie mit all Ihren Aufzählungen wie folgt zu verwenden:
Die generische Erweiterungsmethode:
Die Aufzählung:
Wie man es benutzt:
Bonus, Aufzählungen mit Flags: Wenn Sie mit normalen Aufzählungen arbeiten, reicht die obige Funktion aus. Wenn jedoch eine Ihrer Aufzählungen mit Flags mehrere Werte annehmen kann, müssen Sie sie wie folgt ändern (Dieser Code verwendet C # 8) Eigenschaften):
Die Aufzählung mit Flaggen:
Wie man es benutzt:
quelle
Basierend auf früheren Antworten habe ich diesen komfortablen Helfer erstellt, um alle DisplayAttribute-Eigenschaften lesbar zu unterstützen:
quelle
Ich habe versucht, dies als Bearbeitung zu tun, aber es wurde abgelehnt. Ich kann nicht verstehen warum.
Das Obige löst eine Ausnahme aus, wenn Sie es mit einer Aufzählung aufrufen, die eine Mischung aus benutzerdefinierten Attributen und einfachen Elementen enthält, z
Daher habe ich den Code geringfügig geändert, um vor dem Zugriff auf benutzerdefinierte Attribute zu suchen und den Namen zu verwenden, wenn keine gefunden werden.
quelle
Mit MVC5 können Sie Folgendes verwenden:
Wenn Sie dann eine Dropdown-Auswahl erstellen möchten, können Sie Folgendes verwenden:
quelle