Ich erstelle eine Auswahlliste in meinem Controller, um sie in der Ansicht anzuzeigen.
Ich versuche es im laufenden Betrieb zu erstellen, irgendwie ... so ...
myViewData.PageOptionsDropDown =
new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");
Es wird kompiliert, aber die Ausgabe ist schlecht ...
<select id="PageOptionsDropDown" name="PageOptionsDropDown">
<option>10</option>
<option>15</option>
<option>25</option>
<option>50</option>
<option>100</option>
<option>1000</option>
</select>
Beachten Sie, wie kein Artikel ausgewählt ist?
Wie kann ich das beheben?
c#
asp.net-mvc
selectlist
Pure.Krome
quelle
quelle
Antworten:
So mache ich es
Auf den zweiten Blick bin ich mir nicht sicher, ob ich weiß, wonach Sie suchen ...
quelle
SelectList sList = new SelectList(selectList, "Text", "Value", selected);
woselected
ist die aktuell ausgewählte KundenIch benutze eine Erweiterungsmethode:
Verwendung
mit
quelle
Verwenden des Konstruktors, der
items, dataValueField, dataTextField, selectedValue
als Parameter akzeptiert :Dann aus Ihrer Sicht:
quelle
Aufbauend auf der Antwort von Thomas Stock habe ich diese überladenen
ToSelectList
Methoden erstellt:In Ihrem Controller können Sie Folgendes tun:
Und schließlich setzen Sie in Ihrer Ansicht:
Dies führt zu der gewünschten Ausgabe. Natürlich können Sie das
"(Select one)"
obige optionLabel weglassen, wenn Sie das erste leere Element nicht möchten:Update: Eine überarbeitete Codeliste mit XML-Kommentaren finden Sie hier .
quelle
Das Problem ist, dass SelectList wie geplant funktioniert. Der Fehler liegt im Design. Sie können die Selected-Eigenschaft in SelectedItem festlegen, dies wird jedoch vollständig ignoriert, wenn Sie die Liste mit dem GetEnumerator () durchlaufen (oder wenn Mvc dies für Sie erledigt). Mvc erstellt stattdessen neue SelectListItems.
Sie müssen den SelectList-Code mit dem SelectListItem [], dem Textnamen, dem Wertnamen und dem SelectedValue verwenden. Achten Sie darauf, den Wert von SelectListItem, den Sie auswählen möchten, als SelectedValue zu übergeben, nicht das SelectListItem selbst! Beispiel:
(nicht getestet, aber ich hatte das gleiche Problem)
dann erhält die 2. Option das Attribut selected = "selected". Das sieht nach guten alten DataSets aus ;-)
quelle
Dies ist eine Option:
quelle
Wenn das buchstäblich alles ist, was Sie tun möchten, behebt das Deklarieren des Arrays als Zeichenfolge das Problem mit dem ausgewählten Element:
quelle
Es ist sehr einfach, SelectList und SelectedValue zusammenzubringen, selbst wenn Ihre Eigenschaft kein einfaches Objekt wie ein Int-, String- oder Double-Wert ist.
Beispiel:
Angenommen, unser Region-Objekt sieht ungefähr so aus:
Und Ihr Ansichtsmodell ist so etwas wie:
Sie können den folgenden Code haben:
Nur wenn Sie die ToString-Methode des Region-Objekts auf Folgendes überschreiben:
Diese haben 100% Garantie zu arbeiten.
Aber ich glaube wirklich, dass der beste Weg, um SelectList zu 100% in allen Situationen zum Laufen zu bringen, darin besteht, die Equals-Methode zu verwenden, um den DropDownList- oder ListBox-Eigenschaftswert für jedes Element in der Elementauflistung zu testen.
quelle
Wenn Sie eine stark typisierte Ansicht haben, müssen Sie anscheinend die ID der Dropdown-Liste so ändern, dass sie NICHT der Name einer Eigenschaft in der geerbten Klasse ist. Anschließend müssen Sie Ihrer POST-Methode (Edit) eine Logik hinzufügen, um den ausgewählten Wert aus der FORMCollection abzurufen und in Ihre Instanz einzufügen, bevor Sie Ihre Änderungen übernehmen.
Das ist sicherlich ein bisschen seltsam, aber ich habe es versucht und es funktioniert.
Wenn Ihre Klasse also ein Feld mit dem Namen "CountryId" hat und Sie eine Liste mit Ländernamen anzeigen, lassen Sie die Dropdown-Liste die ID "CountryName" anstelle von "CountryId" haben. In diesem Beitrag können Sie mit "Collection [" CountryName "] etwas tun. .
quelle
Ich hatte genau das gleiche Problem. Die Lösung ist einfach. Ändern Sie einfach den an den DropDownList-Helfer übergebenen Parameter "name" in einen Parameter, der keiner der in Ihrem ViewModel vorhandenen Eigenschaften entspricht. Lesen Sie hier mehr: http://www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view
Ich zitiere den Dan Watson:
Prost!
quelle
Alle diese Antworten sehen gut aus, aber es scheint, dass der Controller Daten für eine Ansicht in einem bekannten strukturierten Format vorbereitet, anstatt die Ansicht einfach eine über das Modell gelieferte IEnumerable <> iterieren zu lassen und eine Standardauswahlliste zu erstellen und dann DefaultModelBinder zu lassen Liefern Sie den ausgewählten Artikel über einen Aktionsparameter an Sie zurück. Ja, nein, warum nicht? Trennung von Bedenken, ja? Scheint seltsam, wenn der Controller etwas so UI- und View-spezifisch erstellt.
quelle
Einfach:
quelle
Ich habe es einfach so gemacht und hatte keine Probleme,
und
es hat auch funktioniert, wenn Sie dies tun,
und
quelle
Anhand Ihres Beispiels hat dies bei mir funktioniert:
Regler:
Aussicht:
quelle
quelle
So mach ich es:
Das ToArray () kümmert sich um die Probleme.
quelle
Wenn Sie zufälligen Text an Ihre DropDownList übergeben möchten, z. B. --Select-- , können Sie dies einfach mit folgendem Code tun:
quelle
Es kann vorkommen, dass Ihre ViewData mehrdeutig sind:
Schauen Sie hier
quelle
Der im Modell ausgewählte Wert wird anstelle des Standardelements verwendet. (Ich bin damit einverstanden, dass ich nicht alle Beiträge gelesen habe)
quelle
Ich kann mich nicht erinnern, wie mvc 1 eingerichtet wurde, aber es scheint, dass die Auswahlliste den gleichen Namen haben soll wie das Feld, zu dem sie gehörte ...
Wie oben erwähnt, stellte ich fest, dass meine Auswahllisten in mvc2 nicht funktionierten, als die ViewData, unter denen sie gesendet wurden, den gleichen Namen wie das Feld hatten.
Beispielsweise:
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>
funktioniert wenn
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>
funktioniert nicht, da der ViewData-Name "ForID" den gleichen Namen hat wie das Feld, für das er arbeitet
quelle
Eine mögliche Erklärung ist, dass der Auswahllistenwert, an den Sie binden, keine Zeichenfolge ist.
Ist der Parameter 'PageOptionsDropDown' in diesem Beispiel eine Zeichenfolge in Ihrem Modell? Wenn dies nicht der Fall ist, wird der ausgewählte Wert in der Liste nicht angezeigt.
quelle
Wenn Sie im Quellcode für MVC 2 nach der Erweiterungsmethode Html.DropDownList suchen, wird die SelectedValue-Eigenschaft der SelectList-Klasse niemals überprüft. Es wird immer nur versucht, mit Ihrem Modell übereinzustimmen.
Alle oben genannten sind Variationen eines Themas, dh wie senden Sie eine Reihe von Daten an die Ansicht, um eine Dropdown-Liste zu erhalten, und sie sind alle so gut wie einander (mehr oder weniger).
Das Problem liegt in der Ansicht. Erstellen Sie entweder Ihre eigene DropDownList-Erweiterungsmethode, die den von Ihnen festgelegten Auswahlwert berücksichtigt, oder iterieren Sie manuell. Was für Sie am besten funktioniert.
quelle
Wenn Sie eine Sammlung in Ihrem Modell haben und Ihre Ansicht stark typisiert ist, funktioniert eine Variation davon:
-oder-
quelle