Próbuję użyć Html.DropDownList
metody rozszerzenia, ale nie mogę wymyślić, jak jej użyć z wyliczeniem.
Powiedzmy, że mam takie wyliczenie:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
Jak przejść do tworzenia listy rozwijanej z tymi wartościami przy użyciu Html.DropDownList
metody rozszerzenia?
Czy może najlepiej jest po prostu utworzyć pętlę for i ręcznie utworzyć elementy HTML?
c#
asp.net
asp.net-mvc
Kevin Pang
źródło
źródło
ASP.NET MVC
jest natywny sposób: stackoverflow.com/a/22295360/1361084Wiem, że spóźniłem się na przyjęcie, ale pomyślałem, że ten wariant może ci się przydać, ponieważ pozwala on również na użycie ciągów opisowych zamiast stałych wyliczania w menu rozwijanym. Aby to zrobić, udekoruj każdą pozycję wyliczenia atrybutem [System.ComponentModel.Description].
Na przykład:
Oto mój kod:
Możesz to zrobić według własnego uznania:
Mam nadzieję, że to ci pomoże!
** EDIT 2014-JAN-23: Microsoft właśnie wydał MVC 5.1, który ma teraz funkcję EnumDropDownListFor. Niestety wydaje się, że nie przestrzega atrybutu [Opis], więc powyższy kod nadal obowiązuje. Patrz sekcja Enum w uwagach do wydania Microsoft dla MVC 5.1.
Aktualizacja: obsługuje jednak atrybut Display
[Display(Name = "Sample")]
, więc można go użyć.[Aktualizacja - właśnie to zauważyłem, a kod wygląda jak rozszerzona wersja kodu tutaj: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , z kilkoma dodatkami. Jeśli tak, uznanie autorstwa wydaje się uczciwe ;-)]
źródło
System.Web.Mvc.Html
to, żeDropDownListFor
nie można go znaleźć, ale nie można go rozwiązać. Musisz to zrobić ręcznieusing System.Web.Mvc.Html;
. Po prostu wiesz.W ASP.NET MVC 5.1 dodano
EnumDropDownListFor()
pomocnika, więc nie ma potrzeby niestandardowych rozszerzeń:Model :
Zobacz :
Za pomocą Tag Helper (ASP.NET MVC 6) :
źródło
Natknąłem się na ten sam problem, znalazłem to pytanie i pomyślałem, że rozwiązanie zapewnione przez Asha nie było tym, czego szukałem; Samo tworzenie kodu HTML oznacza mniejszą elastyczność niż funkcja wbudowana
Html.DropDownList()
.Okazuje się, że C # 3 itp. Czyni to całkiem łatwym. Mam
enum
nazywaTaskStatus
:To tworzy dobre stare,
SelectList
które mogą być używane tak, jak jesteś przyzwyczajony w widoku:Anonimowy typ i LINQ czyni to o wiele bardziej eleganckim IMHO. Bez przestępstwa, Ash. :)
źródło
select new { ID = (int)s, Name = s.ToString() };
Oto lepiej zamknięte rozwiązanie:
https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5
Powiedz tutaj, jest twój model:
Przykładowe użycie:
Wygenerowany interfejs użytkownika:
I wygenerowany HTML
Migawka Kod źródłowy rozszerzenia pomocnika:
Możesz pobrać przykładowy projekt z linku, który podałem.
EDYCJA: Oto kod:
źródło
Html.DropDownListFor wymaga tylko IEnumerable, więc alternatywa dla rozwiązania Prise jest następująca. Pozwoli ci to po prostu napisać:
[Gdzie SelectedItemType jest polem w twoim modelu typu ItemTypes, a twój model jest różny od null]
Poza tym tak naprawdę nie trzeba generalizować metody rozszerzenia, ponieważ można użyć enumValue.GetType () zamiast typeof (T).
EDYCJA: Zintegrowane tutaj rozwiązanie Simona i uwzględniająca metodę rozszerzenia ToDescription.
źródło
Więc bez funkcji rozszerzenia, jeśli szukasz prostego i łatwego .. To właśnie zrobiłem
gdzie XXXXX.Sites.YYYY.Models.State jest enum
Prawdopodobnie lepiej jest wykonać funkcję pomocnika, ale gdy będzie mało czasu, wykona to zadanie.
źródło
Rozwijając odpowiedzi na nagrodę i Rune, jeśli chcesz, aby atrybut wartości wybranych elementów listy odwzorował na wartość całkowitą typu wyliczenia, a nie na ciąg znaków, użyj następującego kodu:
Zamiast traktować każdą wartość wyliczenia jako obiekt TEnum, możemy traktować ją jako obiekt, a następnie rzutować ją na liczbę całkowitą, aby uzyskać wartość rozpakowaną.
Uwaga: Dodałem również ogólne ograniczenie typu, aby ograniczyć typy, dla których to rozszerzenie jest dostępne tylko dla struktur (typ podstawowy Enum), oraz sprawdzanie poprawności typu w czasie wykonywania, które zapewnia, że przekazywana struktura jest rzeczywiście Enum.
Aktualizacja 23.10.12: Dodano parametr typu ogólnego dla typu bazowego i naprawiono problem braku kompilacji wpływający na .NET 4+.
źródło
ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
Value = Convert.ToInt32(e)
.(int)e
nie kompiluje się. :(Aby rozwiązać problem uzyskania numeru zamiast tekstu za pomocą metody rozszerzenia Prise.
źródło
e
doint
.ID = Convert.ToInt32(e)
.Bardzo łatwy sposób to zrobić - bez wszystkich rozszerzeń, które wydają się przesadne, jest to:
Twoje wyliczenie:
Wewnątrz kontrolera powiąż Enum z Listą:
Następnie wrzuć go do torby ViewBag:
Na koniec po prostu połącz go z widokiem:
Jest to zdecydowanie najłatwiejszy sposób, jaki znalazłem i nie wymaga żadnych rozszerzeń ani niczego tak szalonego.
AKTUALIZACJA : Zobacz komentarz Andrewsa poniżej.
źródło
Level1 = 1
, to wartość rozwijana byłaby"Level1"
zamiast1
.Najlepszym rozwiązaniem, jakie znalazłem, było połączenie tego bloga z odpowiedzią Simona Goldstone'a .
Pozwala to na użycie wyliczenia w modelu. Zasadniczo chodzi o to, aby użyć zarówno liczby całkowitej, jak i wyliczenia i emulować tę liczbę.
Następnie użyj atrybutu [System.ComponentModel.Description] do opisania modelu tekstem wyświetlanym i użyj w widoku rozszerzenia „EnumDropDownListFor”.
To sprawia, że widok i model są bardzo czytelne i łatwe do utrzymania.
Model:
Widok:
Rozszerzenie (bezpośrednio z odpowiedzi Simona Goldstone'a , dołączone tutaj dla kompletności):
źródło
Chcesz spojrzeć na użycie czegoś takiego
Enum.GetValues
źródło
źródło
To jest odpowiedź na Runę i Nagrodę zmienioną, aby użyć
int
wartości Enum jako identyfikatora.Przykładowy Enum:
Metoda przedłużenia:
Próbka użycia:
Pamiętaj, aby zaimportować przestrzeń nazw zawierającą metodę Extension
Próbka wygenerowanego HTML:
Pamiętaj, że element, którego używasz do wywoływania,
ToSelectList
to wybrany element.źródło
Id = Convert.ToInt32(e)
.To jest wersja Razor:
źródło
W .NET Core możesz po prostu użyć tego:
źródło
<select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
.Teraz ta funkcja jest obsługiwana od samego początku w MVC 5.1 do
@Html.EnumDropDownListFor()
Sprawdź następujący link:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum
Naprawdę szkoda, że wdrożenie systemu Microsoft wymagało 5 lat, tak jak na powyższe głosowanie!
źródło
Opierając się na odpowiedzi Simona, podobne podejście polega na tym, aby wartości Enum były wyświetlane z pliku zasobów zamiast w atrybucie opisu w samym Enum. Jest to pomocne, jeśli twoja witryna musi być renderowana w więcej niż jednym języku, a jeśli miałbyś mieć konkretny plik zasobów dla Enums, możesz pójść o krok dalej i mieć tylko wartości Enum w swoim Enum i odwoływać się do nich z rozszerzenia przez konwencja taka jak [EnumName] _ [EnumValue] - ostatecznie mniej pisania!
Rozszerzenie wygląda wtedy następująco:
Zasoby w pliku Enums.Resx wyglądające jak ItemTypes_Movie: Film
Inną rzeczą, którą lubię, jest to, że zamiast wywoływać metodę rozszerzenia bezpośrednio, wolę wywoływać ją za pomocą @ Html.EditorFor (x => x.MyProperty), lub najlepiej mieć całą formę w jednym zgrabnym @ Html.EditorForModel (). Aby to zrobić, zmieniam szablon łańcucha, aby wyglądał tak
Jeśli Cię to interesuje, zamieściłem tu na blogu o wiele bardziej szczegółową odpowiedź:
http://paulthecyclist.com/2013/05/24/enum-dropdown/
źródło
Cóż, jestem naprawdę spóźniony na imprezę, ale o ile warto, napisałem blog na ten temat, dzięki czemu tworzę
EnumHelper
zajęcia, które umożliwiają bardzo łatwą transformację.http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23
W twoim kontrolerze:
Twoim zdaniem:
Klasa pomocnicza:
źródło
Bardzo się spóźniłem, ale znalazłem naprawdę fajny sposób, aby to zrobić za pomocą jednego wiersza kodu, jeśli z przyjemnością dodasz pakiet Unconstrained Melody NuGet (ładna, mała biblioteka Jona Skeeta).
To rozwiązanie jest lepsze, ponieważ:
Oto kroki, które pozwolą Ci to uruchomić:
Dodaj właściwość do swojego modelu w taki sposób:
Teraz, gdy masz już listę SelectListItem w swoim modelu, możesz użyć @ Html.DropDownList lub @ Html.DropDownListFor, używając tej właściwości jako źródła.
źródło
Kolejna poprawka do tej metody rozszerzenia - bieżąca wersja nie wybrała bieżącej wartości wyliczenia. Naprawiłem ostatnią linię:
źródło
Jeśli chcesz dodać obsługę lokalizacji, po prostu zmień metodę s.toString () na coś takiego:
Tutaj typof (Zasoby) to zasób, który chcesz załadować, a następnie otrzymasz zlokalizowany ciąg, przydatny również, jeśli twój moduł wyliczający ma wartości z wieloma słowami.
źródło
To jest moja wersja metody pomocniczej. Używam tego:
Zamiast tego:
Oto on:
źródło
Możesz także użyć mojego niestandardowego HtmlHelpers w Griffin.MvcContrib. Poniższy kod:
Generuje:
https://github.com/jgauffin/griffin.mvccontrib
źródło
Chciałbym odpowiedzieć na to pytanie w inny sposób, w którym użytkownik nie musi nic robić w
controller
lubLinq
wyrażać. Tą drogą...mam
ENUM
Teraz mogę po prostu utworzyć
dropdown
za pomocą tegoenum
.LUB
Jeśli chcesz wybrać indeks, spróbuj tego
Tutaj użyłem
AccessLevelEnum.NoAccess
jako dodatkowego parametru do domyślnego wyboru menu rozwijanego.źródło
Znalazłem odpowiedź tutaj . Jednak niektóre moje wyliczenia mają
[Description(...)]
atrybut, więc zmodyfikowałem kod, aby zapewnić obsługę tego:Mam nadzieję, że to pomaga.
źródło
@ Simon Goldstone: Dzięki za twoje rozwiązanie, może być idealnie zastosowane w moim przypadku. Jedynym problemem jest to, że musiałem przetłumaczyć go na VB. Ale teraz jest to zrobione i aby zaoszczędzić czas innych ludzi (na wypadek, gdyby tego potrzebowali), umieszczam to tutaj:
Koniec Używaj go w ten sposób:
źródło
Skończyło się na tym, że stworzyłem metody rozszerzenia, aby zrobić to, co w zasadzie jest akceptowaną odpowiedzią tutaj. Ostatnia połowa Gist dotyczy konkretnie Enum.
https://gist.github.com/3813767
źródło
źródło
źródło