Mam w moim modelu właściwość o nazwie „Promocja”, że jej typ jest wyliczeniem flagi o nazwie „UserPromotion”. Członkowie mojego wyliczenia mają ustawione atrybuty wyświetlania w następujący sposób:
[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
}
Teraz chcę być w stanie utworzyć powiedzmy ul w moim widoku, aby pokazać wybrane wartości mojej właściwości „Promocja”. Tak zrobiłem do tej pory, ale problem polega na tym, jak uzyskać tutaj nazwy wyświetlane?
<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
źródło
źródło
System.ComponentModel.DataAnnotations.DisplayAttribute
. NieSystem.ComponentModel.DisplayNameAttribute
.Odpowiedzi:
AKTUALIZACJA
Pierwsze rozwiązanie koncentrowało się na uzyskiwaniu wyświetlanych nazw z wyliczenia. Poniższy kod powinien być dokładnym rozwiązaniem Twojego problemu.
Możesz użyć tej klasy pomocniczej do wyliczeń:
Następnie możesz użyć go w swoim widoku jako:
Mam nadzieję, że to pomoże! :)
źródło
.ToString
, ale z stackoverflow.com/q/483794/179311 mówi się, aby użyćEnum.GetName
.GetDisplayValue
was powinien pierwszy testdescriptionAttributes == null
przed próby uzyskania dostępu do tablicy:descriptionAttributes[0]
. W przeciwnym razie możesz zgłosić wyjątek, a wiersz poniżej, w którym sprawdzasz, czy null nigdy nie będzie prawdziwy.Jedna wkładka - płynna składnia
Przykład
Wynik
źródło
.NET Framework 4.5
i że dołączasz następujące przestrzenie nazwSystem.Net
System.ComponentModel.DataAnnotations
GetAttribute<TAttribute>
straszna konwencja nazewnictwa? Pobiera określony atrybut i używa osłonki pascal, tak jak powinny to robić wszystkie metody publiczne.Opierając się na na doskonałej odpowiedzi Aydina , oto metoda rozszerzenia, która nie wymaga żadnych parametrów typu.
UWAGA: Zamiast właściwości Name należy użyć GetName (). Zapewnia to, że zlokalizowany ciąg zostanie zwrócony, jeśli zostanie użyta właściwość atrybutu ResourceType.
Przykład
Aby go użyć, po prostu odwołaj się do wartości wyliczenia w swoim widoku.
Wynik
Promocja: Wyślij oferty pracy pocztą
źródło
@Html.DisplayFor(m => m.myEnum.GetDisplayName())
, Która nie zadziała, ponieważ oczekują, że ocenione wyrażenie da właściwość lub coś podobnego. Powinieneś użyć wartości gołego wyliczenia jak w powyższym przykładzieGetCustomAttribute<DisplayAttribute>()
ponieważ dla niektórych Enums może tego nie ma. Powraca do sytuacji,enumValue.ToString()
gdy DisplayAttribute nie był obecny.List<SelectListItem>
który został wypełniony przez Enum ze wszystkimi indywidualnymiDisplayAttribute.Name
adnotacjami - działało idealnie, dziękuję !!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() }); }
Na podstawie odpowiedzi Aydin za Proponuję mniej „duplicatious” Wdrożenie (ponieważ możemy łatwo uzyskać
Type
zEnum
samej wartości, zamiast dostarczania go jako parametr 😉:EDYCJA (na podstawie komentarza @Vahagn Nahapetyan)
Teraz możemy go używać w bardzo czysty sposób:
Co skutkuje w
źródło
this
musi być poprawną (nie zerową) wartością wyliczenia. W przeciwnym razie wywołanie metody już rzuciłoby (co jest obowiązkiem kodu wywołującego). To sprawia, żeGetType()
na pewno zapewni prawidłowy typ wyliczenia, w którymenumvalue
na pewno będzie członkiem. Ale GetCustomAttribute może zwrócić wartość null, więc podałem nietypową wersję metody zwracającej null, gdy łańcuch wywołań metod ma gdzieś wartość null. Dzięki!Jeśli korzystasz z MVC 5.1 lub wyższej, istnieje prostszy i bardziej przejrzysty sposób: użyj adnotacji danych (z
System.ComponentModel.DataAnnotations
przestrzeni nazw), jak poniżej:I w widoku, po prostu umieść go w odpowiednim pomocniku HTML:
źródło
Możesz użyć metody Type.GetMember , a następnie uzyskać informacje o atrybucie za pomocą odbicia:
Było kilka podobnych postów tutaj:
Uzyskiwanie atrybutów wartości Enum
Jak sprawić, by MVC3 DisplayFor wyświetlał wartość atrybutu Display Enum?
źródło
Opierając się na wielką odpowiedzi Todda , który zbudowany na wielką odpowiedź Aydin jest , oto rodzajowe metoda rozszerzenie, które nie wymaga żadnych parametrów typu.
Potrzebowałem tego do mojego projektu, ponieważ coś takiego jak poniższy kod, gdzie nie każdy członek wyliczenia ma
DisplayAttribute
, nie działa z rozwiązaniem Todda:Jeśli jest to skomplikowane rozwiązanie prostego problemu, daj mi znać, ale to była poprawka, której użyłem.
źródło
źródło
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Mam dwa rozwiązania tego pytania.
źródło
W przypadku ASP.Net Core 3.0 zadziałało to dla mnie (podziękowania dla poprzednich użytkowników).
Moja klasa Enum:
Klasa mojego widoku:
Przykład widoku brzytwy z etykietą i rozwijaną listą. Zauważ, że lista rozwijana nie wymaga metody pomocniczej:
źródło
Musisz użyć odrobiny refleksji, aby uzyskać dostęp do tego atrybutu:
Zalecam zawinięcie tej metody w metodę rozszerzenia lub wykonanie tego w modelu widoku.
źródło
Z Core 2.1
źródło
łączenie wszystkich skrzynek razem z góry:
Equals
,ToString
)Display
atrybutoto mój kod:
źródło
Przepraszam, że to zrobiłem, ale nie mogłem użyć żadnej z pozostałych odpowiedzi w obecnej postaci i nie mam czasu, aby opisać to w komentarzach.
Używa składni C # 6.
źródło
Opierając się na odpowiedziach Aydina i Todda, oto metoda rozszerzenia, która pozwala również uzyskać nazwę z pliku zasobów
i używaj go jak
źródło
Chcę wnieść wkład w zależne od kultury rozszerzenie enum GetDisplayName. Mam nadzieję, że przyda się to każdemu, kto wcześniej przegląda tę odpowiedź:
„standardowy” sposób, o którym wspominali Aydin Adn i Todd :
Sposób „zależny od kultury”:
źródło
Aktualizacja 2020: zaktualizowana wersja funkcji udostępnianej przez wiele osób w tym wątku, ale teraz od wersji C # 7.3:
Teraz możesz ograniczyć metody ogólne do typów wyliczeń, dzięki czemu możesz napisać jedno rozszerzenie metody, aby używać go ze wszystkimi wyliczeniami w następujący sposób:
Ogólna metoda rozszerzenia:
Wyliczenie:
Jak tego użyć:
Bonus, wyliczenia z flagami: jeśli masz do czynienia z normalnymi wyliczeniami, powyższa funkcja jest wystarczająca, ale jeśli dowolna z twoich wyliczeń może przyjmować wiele wartości za pomocą flag, musisz zmodyfikować ją w ten sposób (ten kod używa C # 8 cechy):
Wyliczenie z flagami:
Jak tego użyć:
źródło
Na podstawie poprzednich odpowiedzi stworzyłem tego wygodnego pomocnika do obsługi wszystkich właściwości DisplayAttribute w czytelny sposób:
źródło
Próbowałem zrobić to jako edycję, ale zostało odrzucone; Nie rozumiem dlaczego.
Powyższe spowoduje zgłoszenie wyjątku, jeśli nazwiesz go Enum, który ma mieszankę niestandardowych atrybutów i zwykłych przedmiotów, np
Zmodyfikowałem więc nieco kod, aby sprawdzić niestandardowe atrybuty, zanim spróbuję uzyskać do nich dostęp, i użyj nazwy, jeśli nie zostaną znalezione.
źródło
Korzystając z MVC5 możesz użyć:
jeśli chcesz utworzyć rozwijany selektor, możesz użyć:
źródło