Wir haben ein einfaches ASP.NET MVC-Formular mit vielen Feldern. Das erste Feld ist das wichtigste und es ist eine Dropdown-Liste. Sagen wir es ist das Firmenfeld und es enthält zwei Werte "Coca Cola" und "Pepsi".
Das Firmenfeld sieht folgendermaßen aus:
%Vor% Weil es wichtig ist, dass diese Wahl aktiv gemacht wird und nicht einfach auf "Coca Cola" zurückbleibt, einfach weil es zuerst alphabetisch ist, müssen wir das Feld zuerst leer sein (Validierungsdaten-Annotationen sorgen dafür, dass der Benutzer gezwungen wird,
Dies ist mit Javascript einfach so gemacht:
%Vor%Es gibt jedoch einige Fälle, in denen das Formular nicht vollständig leer geladen wird, stattdessen wird das Firmenfeld im Controller wie folgt initialisiert:
%Vor%und in solchen Fällen wollen wir natürlich nicht, dass das Javascript ausgeführt und gelöscht wird.
Was ist die normale Lösung in solchen Fällen?
Meine Vermutung war richtig: Die DropDownListFor
erzeugt das Attribut selected
nicht, wenn der Anfangswert null ist.
Bei leerer Firma erzeugt es folgendes HTML:
%Vor%Bei ausgewählten Unternehmen ist der HTML-Code anders:
%Vor%So können Sie diesen JavaScript-Code verwenden und es wird funktionieren:
%Vor% Auch wenn Ihre jquery-Version älter als 1.9.0 ist, funktioniert der Ausdruck option[selected]
möglicherweise nicht richtig. Der Fehler ist in 1.9.0 behoben, aber in früheren Versionen funktionierten Funktionen wie 'filter', 'children' und 'is' falsch, während 'find' und 'has' ein korrektes Ergebnis zurückgegeben haben.
Ich hatte vor ein paar Tagen ein ähnliches Problem, als ich mein Dropdown auf den ersten Index setzen wollte, es sei denn, es wurde irgendwann ausgewählt. Ich habe eine Session-Variable als Abhilfe verwendet ... so etwas könnte den Trick bewirken:
%Vor%... und für die Aktion Index () des aktuellen Controllers:
%Vor%Im Wesentlichen setze ich den aktuellen Wert des Dropdowns auf den Wert der Sitzungsvariablen. Wenn ich den Dropdown-Wert ändern möchte, weise ich der Session var einfach einen neuen Wert zu! Während die Sitzungsvariable null oder wertlos ist, setze das Dropdown auf meinen gewünschten Index.
Hoffe, das hilft.
Hier ist eine saubere Möglichkeit, das zu tun:
Fügt der Liste ein optionales Label hinzu, das ausgewählt wird, wenn der Modell-Firmenwert leer ist, ansonsten wird der aktuelle Wert vorgewählt angezeigt (keine Notwendigkeit für den javaScript-Select-Code), auch wenn der Benutzer keinen Wert he auswählt kann die Validierung nicht bestehen:
%Vor%OPTION 1:
Sie können die Logik in die Aktionsmethode im Controler einfügen.
Beispiel: Controller
%Vor%Firma Klasse
%Vor%In Ihrer Form (Beachten Sie, dass das optionale Label bei einem Sonderfall nicht angezeigt wird)
%Vor%OPTION 2:
Erstellen Sie eine benutzerdefinierte Dropdown-Liste (benutzerdefinierter HTML-Helfer)
Tags und Links asp.net-mvc javascript html forms