Ich habe versucht, dies ist RC1 und dann auf RC2 aktualisiert, wodurch das Problem nicht behoben wurde.
// in my controller
ViewData["UserId"] = new SelectList(
users,
"UserId",
"DisplayName",
selectedUserId.Value); // this has a value
Ergebnis: Die SelectedValue-Eigenschaft wird für das Objekt festgelegt
// in my view
<%=Html.DropDownList("UserId", (SelectList)ViewData["UserId"])%>
Ergebnis: Alle erwarteten Optionen werden auf dem Client gerendert, das ausgewählte Attribut wird jedoch nicht festgelegt. Das Element in SelectedValue ist in der Liste vorhanden, das erste Element in der Liste ist jedoch standardmäßig ausgewählt.
Wie soll ich das machen?
Update Dank der Antwort von John Feminella habe ich herausgefunden, wo das Problem liegt. "UserId" ist eine Eigenschaft in dem Modell, in das meine Ansicht stark typisiert ist. Wenn Html.DropDownList ("UserId" in einen anderen Namen als "UserId" geändert wird, wird der ausgewählte Wert korrekt gerendert.
Dies führt jedoch dazu, dass der Wert nicht an das Modell gebunden ist.
quelle
Antworten:
So habe ich dieses Problem behoben:
Ich hatte folgendes:
Regler:
Aussicht
Geändert durch:
Aussicht
Es scheint, dass DropDown nicht denselben Namen haben darf wie ViewData: S seltsam, aber es hat funktioniert.
quelle
Versuche dies:
Und dann:
Mit MVC RC2 bekomme ich:
quelle
Sie können DropDown weiterhin als "UserId" bezeichnen und die Modellbindung funktioniert weiterhin ordnungsgemäß.
Damit dies funktioniert, muss der ViewData-Schlüssel, der die SelectList enthält, nicht denselben Namen wie die Model-Eigenschaft haben, die Sie binden möchten. In Ihrem speziellen Fall wäre dies:
Dadurch wird ein Auswahlelement mit dem Namen UserId erstellt, das denselben Namen wie die UserId-Eigenschaft in Ihrem Modell hat. Daher wird es vom Modellbinder mit dem Wert festgelegt, der im vom Html.DropDownList-Helfer generierten Auswahlelement des HTML-Codes ausgewählt wurde.
Ich bin nicht sicher, warum dieser bestimmte Html.DropDownList-Konstruktor den in der SelectList angegebenen Wert nicht auswählt, wenn Sie die Auswahlliste in die ViewData mit einem Schlüssel einfügen, der dem Eigenschaftsnamen entspricht. Ich vermute, es hat etwas damit zu tun, wie der DropDownList-Helfer in anderen Szenarien verwendet wird, in denen die Konvention lautet, dass Sie in den ViewData eine SelectList mit demselben Namen wie die Eigenschaft in Ihrem Modell haben. Dies wird korrekt funktionieren:
quelle
Wenn wir nicht glauben, dass dies ein Fehler ist, den das Team beheben sollte, sollte MSDN das Dokument zumindest verbessern. Das Verwirrende kommt wirklich von dem schlechten Dokument davon. In MSDN wird der Name des Parameters wie folgt erläutert :
Dies bedeutet nur, dass das endgültige HTML, das es generiert, diesen Parameter als Namen der Auswahleingabe verwendet. Aber es bedeutet tatsächlich mehr als das.
Ich denke, der Designer geht davon aus, dass der Benutzer ein Ansichtsmodell verwendet, um die Dropdown-Liste anzuzeigen, und auch den Post zurück zu derselben verwendet Ansichtsmodell verwendet. In vielen Fällen folgen wir dieser Annahme jedoch nicht wirklich.
Verwenden Sie das obige Beispiel,
Wenn wir der Annahme folgen, sollten wir ein Ansichtsmodell für diese Dropdown-Liste definieren
Denn wenn Post zurück, nur der ausgewählte Wert Post zurück wird, so dass er es annehmen sollte das Modell der Eigenschaft SelectedPersonId Post zurück, die Html.DropDownList erster Parameter bedeutet Name soll ‚SelectedPersonId‘ sein. Der Designer ist daher der Ansicht, dass beim Anzeigen der Modellansicht in der Ansicht die Modelleigenschaft SelectedPersonId den Standardwert dieser Dropdown-Liste enthalten sollte. Obwohl Ihre List <SelectListItem> -Personen bereits das Flag Selected gesetzt haben, um anzugeben, welche ausgewählt / standardmäßig ist, ignoriert die tml.DropDownList dies tatsächlich und erstellt ihre eigene IEnumerable <SelectListItem> neu und legt das Standard- / ausgewählte Element basierend auf dem Namen fest.
Hier ist der Code von asp.net mvc
Der Code ging also tatsächlich weiter und versuchte nicht nur, den Namen im Modell nachzuschlagen, sondern auch in den Ansichtsdaten. Sobald er einen findet, wird die selectList neu erstellt und Ihre ursprüngliche Selected ignoriert.
Das Problem ist, dass wir es in vielen Fällen nicht wirklich so verwenden. Wir wollen nur eine Auswahlliste mit einem / mehreren Elementen einwerfen. Ausgewählte Menge wahr.
Natürlich ist die Lösung einfach. Verwenden Sie einen Namen, der weder im Modell noch in den Ansichtsdaten enthalten ist. Wenn keine Übereinstimmung gefunden werden kann, wird die ursprüngliche Auswahlliste verwendet, und die ursprüngliche Auswahl wird wirksam.
Aber ich denke immer noch, dass mvc es verbessern sollte, indem es eine weitere Bedingung hinzufügt
Denn wenn die ursprüngliche selectList bereits eine Selected hatte, warum sollten Sie das ignorieren?
Nur meine Gedanken.
quelle
Der Code im vorherigen MVC 3-Beitrag funktioniert nicht, ist aber ein guter Anfang. Ich werde es reparieren. Ich habe diesen Code getestet und er funktioniert in MVC 3 Razor C # Dieser Code verwendet das ViewModel-Muster, um eine Eigenschaft zu füllen, die a zurückgibt
List<SelectListItem>
.Die Modellklasse
Die ViewModel-Klasse
Die Controller-Methode
Die Aussicht
Die HTML-Ausgabe wird so etwas wie sein
abhängig davon, wie Sie die Ausgabe formatieren. Ich hoffe das hilft. Der Code funktioniert.
quelle
selected
Option nicht.Dies scheint ein Fehler in der SelectExtensions-Klasse zu sein, da nur die ViewData und nicht das Modell für das ausgewählte Element überprüft werden. Der Trick besteht also darin, das ausgewählte Element aus dem Modell unter dem Namen der Eigenschaft in die ViewData-Auflistung zu kopieren.
Dies geht aus der Antwort hervor, die ich in den MVC-Foren gegeben habe. Ich habe auch eine vollständigere Antwort in einem Blog-Beitrag , der das DropDownList-Attribut von Kazi verwendet ...
Gegeben ein Modell
und ein grundlegendes Ansichtsmodell von
Dann schreiben wir eine DropDownList-Editor-Vorlage wie folgt.
Dies funktioniert auch, wenn Sie ArticleType im Ansichtsmodell in ein SelectListItem ändern. Sie müssen jedoch einen Typkonverter gemäß Kazis Blog implementieren und registrieren, um den Ordner zu zwingen, dies als einfachen Typ zu behandeln.
In Ihrem Controller haben wir dann ...
quelle
Das Problem ist, dass Dropboxen nicht wie Listboxen funktionieren, zumindest so, wie es das ASP.NET MVC2-Design erwartet: Eine Dropbox lässt nur null oder einen Wert zu, da Listboxen eine Auswahl mit mehreren Werten haben können. Aus Gründen der HTML-Genauigkeit sollte dieser Wert nicht in der Optionsliste als "ausgewähltes" Flag, sondern in der Eingabe selbst enthalten sein.
Siehe folgendes Beispiel:
Für die Kombination ist die Option ausgewählt, aber auch das Wertattribut festgelegt . Wenn Sie also möchten, dass ASP.NET MVC2 eine Dropbox rendert und auch einen bestimmten Wert ausgewählt hat (z. B. Standardwerte usw.), sollten Sie ihm beim Rendern einen Wert wie folgt geben:
quelle
In ASP.NET MVC 3 können Sie Ihre Liste einfach zu ViewData hinzufügen ...
... und dann in Ihrer Rasiermesseransicht namentlich referenzieren ...
Sie müssen die Liste im DropDownList-Aufruf nicht manuell "verwenden". Wenn Sie dies auf diese Weise tun, stellen Sie den ausgewählten Wert auch für mich richtig ein.
Haftungsausschluss:
quelle
Ich habe es geschafft, das gewünschte Ergebnis zu erzielen, aber mit einem etwas anderen Ansatz. In der Dropdown-Liste habe ich das Modell verwendet und dann darauf verwiesen. Ich bin mir nicht sicher, ob Sie danach gesucht haben.
Model.Matters.FeeStructures oben ist meine ID, die Ihr Wert des Elements sein kann, das ausgewählt werden soll.
quelle