Tworzę listę selectList w moim kontrolerze, aby wyświetlić ją w widoku.
Próbuję stworzyć to w locie, coś w rodzaju ... w ten sposób ...
myViewData.PageOptionsDropDown =
new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");
Kompiluje się, ale wynik jest zły ...
<select id="PageOptionsDropDown" name="PageOptionsDropDown">
<option>10</option>
<option>15</option>
<option>25</option>
<option>50</option>
<option>100</option>
<option>1000</option>
</select>
Zauważ, że żaden element nie jest wybrany?
Jak mogę to naprawić?
c#
asp.net-mvc
selectlist
Pure.Krome
źródło
źródło
Odpowiedzi:
Tak to robię
Na pierwszy rzut oka nie jestem pewien, czy wiem, czego szukasz ...
źródło
SelectList sList = new SelectList(selectList, "Text", "Value", selected);
gdzieselected
jest aktualnie wybrany klientUżywam metody rozszerzenia:
stosowanie
z
źródło
Używając konstruktora, który akceptuje
items, dataValueField, dataTextField, selectedValue
jako parametry:Zatem Twoim zdaniem:
źródło
Opierając się na odpowiedzi Thomasa Stocka, stworzyłem te przeciążone
ToSelectList
metody:W kontrolerze możesz wykonać następujące czynności:
I na koniec w swoim Widoku umieść:
Daje to pożądane wyjście - oczywiście możesz
"(Select one)"
pominąć powyższą opcję Etykieta, jeśli nie chcesz, aby pierwszy pusty element:Aktualizacja: poprawioną listę kodu można znaleźć tutaj z komentarzami XML.
źródło
Problem w tym, że SelectList działa zgodnie z projektem. Błąd tkwi w projekcie. Możesz ustawić Selected Property w SelectedItem, ale zostanie to całkowicie zignorowane, jeśli przejdziesz przez listę za pomocą GetEnumerator () (lub jeśli Mvc zrobi to za Ciebie). Mvc utworzy zamiast tego nowe SelectListItems.
Musisz użyć wskaźnika SelectList z SelectListItem [], Text-Name, Value-Name i SelectedValue. Pamiętaj, aby przekazać jako SelectedValue wartość SelectListItem, którą chcesz wybrać, a nie sam SelectListItem! Przykład:
(nie testowałem tego, ale miałem ten sam problem)
wtedy druga opcja otrzyma atrybut selected = "selected". To wygląda jak stare, dobre zestawy danych ;-)
źródło
To jest opcja:
źródło
Jeśli to dosłownie wszystko, co chcesz zrobić, po prostu zadeklarowanie tablicy jako ciągu znaków rozwiązuje problem z wybranym elementem:
źródło
Bardzo łatwo jest sprawić, aby SelectList i SelectedValue współpracowały ze sobą, nawet jeśli twoja właściwość nie jest prostym obiektem, takim jak wartość Int, String lub Double.
Przykład:
Zakładając, że nasz obiekt Region jest mniej więcej taki:
Twój model widoku to coś takiego:
Możesz mieć poniższy kod:
Tylko jeśli nadpisujesz metodę ToString obiektu Region na coś takiego:
To ma 100% gwarancję działania.
Ale naprawdę uważam, że najlepszym sposobem, aby SelectList działał w 100% we wszystkich przypadkach, jest użycie metody Equals w celu przetestowania wartości właściwości DropDownList lub ListBox dla każdego elementu w kolekcji elementów.
źródło
Wygląda na to, że jeśli masz mocno wpisany widok, musisz zmienić identyfikator menu, aby NIE był to nazwa właściwości w dziedziczonej klasie. Następnie musisz wprowadzić pewną logikę do swojej metody edit (POST), aby pobrać wybraną wartość z FORMCollection i umieścić ją w swojej instancji przed zatwierdzeniem zmian.
Jest to z pewnością trochę dziwne, ale próbowałem i działa.
Więc jeśli Twoja klasa ma pole o nazwie CountryId powiedz, i wyświetlasz listę nazw krajów, spraw, aby menu zawierało identyfikator CountryName zamiast CountryId, a następnie w poście możesz coś zrobić z Collection ["CountryName"] .
źródło
Miałem dokładnie ten sam problem. Rozwiązanie jest proste. Po prostu zmień parametr „name” przekazany do pomocnika DropDownList na coś, co nie pasuje do żadnej z właściwości istniejących w Twoim ViewModel. czytaj więcej tutaj: http://www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view
Cytuję Dana Watsona:
Twoje zdrowie!
źródło
Wszystkie te odpowiedzi wyglądają świetnie, ale wydaje się, że kontroler przygotowuje dane do widoku w dobrze znanym formacie strukturalnym, zamiast pozwolić widokowi po prostu iterować IEnumerable <> dostarczony za pośrednictwem modelu i zbudować standardową listę wyboru, a następnie pozwolić DefaultModelBinder dostarczyć wybraną pozycję z powrotem do Ciebie za pośrednictwem parametru działania. Tak, nie, czemu nie? Rozdzielenie obaw, tak? Wydaje się dziwne, że kontroler buduje coś tak specyficznego dla interfejsu użytkownika i widoku.
źródło
Prosty:
źródło
Po prostu uruchomiłem to w ten sposób i nie miałem żadnych problemów,
i
zadziałało też, jeśli to zrobisz,
i
źródło
Używając twojego przykładu, zadziałało to dla mnie:
kontroler:
widok:
źródło
źródło
Robię to tak:
ToArray () rozwiązuje problemy.
źródło
Jeśli chcesz przekazać losowy tekst do swojej DropDownList, na przykład - Wybierz - możesz to łatwo zrobić za pomocą tego kodu:
źródło
Może się zdarzyć, że masz pewną niejednoznaczność w swoich ViewData:
Spójrz tutaj
źródło
wartość wybrana w modelu ma zastosowanie zamiast pozycji domyślnej. (Zgadzam się, nie przeczytałem wszystkich postów)
źródło
Nie pamiętam, jak skonfigurowano mvc 1, ale wygląda na to, że lista wyboru chciała mieć taką samą nazwę jak pole, do którego należy ...
To, co znalazłem, jak ktoś powiedział powyżej, to to, że moje listy wyboru nie działały w mvc2, gdy ViewData, które zostały wysłane, nosiły taką samą nazwę jak pole.
Na przykład:
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>
działa, kiedy
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>
nie działa, ponieważ nazwa ViewData „ForID” ma taką samą nazwę jak pole, dla którego pracuje
źródło
Możliwym wyjaśnieniem jest to, że wartość listy wyboru, z którą się łączysz, nie jest ciągiem.
Czy w tym przykładzie parametr „PageOptionsDropDown” jest ciągiem znaków w Twoim modelu? Bo jeśli tak nie jest, to wybrana wartość na liście nie zostanie pokazana.
źródło
Jeśli spojrzysz na kod źródłowy MVC 2 w metodzie rozszerzenia Html.DropDownList, nigdy nie sprawdza ona właściwości SelectedValue klasy SelectList. Będzie tylko próbował dopasować się do Twojego Modelu.
Wszystkie powyższe są wszystkimi odmianami tematu, tj. Jak wysłać zbiór danych do widoku do listy rozwijanej i wszystkie są tak dobre jak inne (mniej więcej).
Problem jest w widoku. Utwórz własną metodę rozszerzenia DropDownList, która nie respektuje ustawionej przez Ciebie wartości select lub wykonaj iterację ręcznie. Który kiedykolwiek działa najlepiej dla Ciebie.
źródło
Jeśli masz kolekcję w swoim modelu, a Twój widok jest silnie typem, niektóre odmiany będą działać:
-lub-
źródło