2010-03-03 7 views
7

Próbuję ustawić wybrane wartości dla MultiSelectList, ale strona nie wyświetla żadnych wartości, jak zaznaczono. Próbowałem każdego praktycznego sposobu, aby to zrobić i nadal uzyskiwałem takie same wyniki. Obecnie próbuję przekazać listę wybranych obiektów za pośrednictwem konstruktora. To, co mnie spotyka, polega na tym, że gdy sprawdzam obiekt MultiSelectList, właściwość selectedvalues ​​zawiera elementy, które przekazałem do niego za pomocą konstruktora, ale nadal nie pokazuje..NET MVC MultiSelectList i wybrane wartości

Zauważyłem, że wiele osób ma ten sam problem, ale nie widziałem odpowiedzi, która sprawdziła się u mnie. Próbowałem Iterowanie przez listę i ustawienie właściwość true, próbowałem tworzenie od zera multiselectlist i ustawienie każdej pojedynczej pozycji wybranej właściwości i próbowałem używać konstruktora. Żadne z nich nie zadziałało. Znalazłem także sugestię, że właściwości MultiSelectList nie można nazwać taką samą jak kontrola (co próbowałem) i która nie działała. Srsly, dlaczego tak trudno jest utworzyć listę rozwijaną z wybranymi wartościami za pomocą tego schematu? Czy czegoś brakuje?

Zjednoczone Practice:
<% = Html.ListBox ("StatesOfPractice" Model.StatesOfPracticeList)%>
<% = Html.ValidationMessage ("StatesOfPractice")%>

EDIT # 1

Wydaje się, że dzieje się, gdy tworzę instancję MultiSelectList. Jeśli sprawdzę obiekt w widoku i otworzę widok wyników, zauważę, że "Alaska" nie jest wybrana, gdy wiem, że powinna być.

http://imgur.com/eTIdH.jpg

Mam instancji w ten sposób.

nowa MultiSelectList (lista, "kod", "opis", lista);

GenericDataContract to po prostu klasa z dwiema właściwościami: Code i Description. Pierwsza lista to wszystkie stany, druga to moje wybrane stany.

Odpowiedz

1

Uważam, że pobiera wybrane elementy z modelu, a nie z listy elementów. Upewnij się, że właściwość modelu StatesOfPractice jest wypełniona wybranymi elementami. Oznacza to, że właściwość modelu StatesOfPracticeList udostępnia zestaw elementów używanych do zapełniania listy. Właściwość modelu StatesOfPractice, która będzie zbiorem wybranych wartości właściwości podczas księgowania formularza, powinna również zawierać domyślne wybrane wartości podczas renderowania widoku. Pod maską wykorzystuje metodę HtmlHelper GetModelStateValue, aby znaleźć wybrane wartości dla dowolnej listy wyboru. Zakładam, że robi się to tak, aby łatwiej było zachować wybrane wartości, gdy wystąpi błąd sprawdzania poprawności, a formularz jest ponownie wysyłany z błędami stanu modelu.

+0

Przeniesiony komentarz - zobacz zmiany do wpisu – jamesamuir

8

Grrrrrr, znalazłem to. Najwyraźniej wybrane pozycje mogą być tylko listą ciągów. Po zmodyfikowaniu kodu, aby go przekazać, wybrałem wartości.

tvanfosson - dzięki za pomoc i szybką reakcję. mile widziane!

+0

Zmagałem się z tym przez ponad godzinę, aż znajdę twoje pytanie. Zakładam, że to nie może być zamierzone zachowanie. Jak trudne może być naprawienie tego? – Bardo

3

OK, ten naprawdę mnie pomylił, ale myślę, że mam to ustalone.

Problem I miał coraz MultiSelectList do wyświetlania z domyślnych wybranych zostało, że używałem @Html.DropDownListFor(...) aby wyświetlić WYBIERZ listy zamiast @Html.ListBoxFor(...). Złudzenia, DropDownListForwyświetli multi listy select jeśli określić atrybuty HTML, aby zmusić go, aby to zrobić, ale wartości domyślne nie będzie pracy, ponieważ jest przeznaczony tylko do jednego domyślne - obowiązują następujące dlatego nie domyślnie wszystkie są wybrane:

List<string> myStrings; 
myStrings = new List<string>(); 
myStrings.Add("aaa"); 
myStrings.Add("bbb"); 
myStrings.Add("ccc"); 

ViewData["MyStringsDropdown"] = new MultiSelectList(
    myStrings.Select(abc => new { StringId = abc, Title = abc + "Title" }), 
    "StringId", 
    "Title", 
    myStrings.Where(str => str == "aaa" || str == "ccc").ToList() 
); 

... 

@Html.DropDownListFor(model => model.MyStrings, (MultiSelectList)ViewData["MyStringsDropdown"], new { size = "10", multiple = "multiple" }) 

Jednakże po będzie wyświetlania domyślnych "aaa ccc" i "" wzorów:

@Html.ListBoxFor(model => model.MyStrings, (MultiSelectList)ViewData["MyStringsDropdown"], new { size = "10", multiple = "multiple" }) 

Ale tu jest prawdziwy kicker; ASP.NET wydaje czasami cache rodzaj kontroli, więc można wymienić DropDownListFor z ListBoxFor i nie będzie nadal wstępnie wybrać wartości domyślne dopiero po ponownym uruchomieniu procesu roboczego IIS. Uważam, że to naprawdę dziwne i rzuciło mi to na chwilę.