Ich habe eine Webseite mit zwei <asp:DropDown>
Steuerelementen:
Wenn der Benutzer ein Land auswählt, möchte ich die Liste der Zustände ausfüllen.
Die erste Sache war ziemlich einfach: Füllen Sie die zweite Box in OnSelectedIndexChanged
der ersten Dropdown-Liste:
Das hat gut funktioniert, außer dass es eine Seitenaktualisierung auslöst. Der Benutzer wird unterbrochen, während der Post gesendet wird, und die Seite wird neu geladen. Und die Seite ist nicht mehr dort, wo sie sie verlassen hat, und sie sitzen nicht länger im Drop-down.
@Seglo nennt UpdatePanels einen altmodischen Klotz . Aber da ich nichts besseres finde - lass es uns versuchen! Wickeln Sie das Zeug in ein Update-Panel, und lassen Sie es tun, es ist Magie:
Das Problem dabei ist, dass bei der Aktualisierung von UpdatePanel
beide Steuerelemente gelöscht und durch neue ersetzt werden. Dies bedeutet, dass der Benutzer seinen Fokus im ersten Dropdown verloren hat. Leute haben vorgeschlagen, schreckliche Kludges mit Javascript zu versuchen, den Fokus zu speichern und wiederherzustellen . Aber ich würde die Dinge lieber richtig machen.
Ich muss das Land -Dropdown (oder die Labels) nicht aktualisieren . ich brauche nur , um das Dropdown-Menü Status zu aktualisieren. Warum also nicht nur in ein <asp:UpdatePanel>
einbinden? In der Tat ist dies die Antwort, die in StackOverflow vorgeschlagen wird :
Und das funktioniert. Das Dropdown-Menü Land verliert nicht den Fokus. Das OnSelectedIndexChanged
-Ereignis wird ausgelöst und das Status -Dropdown füllt sich ...
... das erste Mal, wenn ich das Länder-Dropdown ändere.
Wenn ich das Land erneut ändere, wird eine Ausnahme ausgelöst:
Ungültiges Postback- oder Callback-Argument.
Irgendwie verwirrt das updatepanel mit den WebForms-Steuerelementen; die Postback-Daten ungültig machen. Dies ist sinnvoll, da durch das Mischen mit WebForms-Steuerelementen die Postback-Daten ungültig werden.
Es bringt dir nichts; aber Leute haben versucht, ein Postback manuell durch Javascript auszulösen :
%Vor% Mit Ausnahme von ClientID
von cbCountry
und UpdatePanel1
wird das Skript nicht ausgeführt. noch weiß ich nicht, ob es mein Problem lösen kann
PageMethods
, um die Statusliste abzurufen. Jetzt verbinde ich nur die zufälligen Vorschläge anderer Leute. Es dauert ungefähr 4 Stunden, um einen Vorschlag umzusetzen. Was bedeutet, dass ich eineinhalb Tage verloren habe, um eine Combo-Box zu füllen.
Ich kann es mir nicht leisten, bei jedem zufälligen Vorschlag, den ich bei Google finde, einen Tag zu verlieren; Ich brauche eine tatsächliche Antwort. Also schließe ich sie nur ein, um den mürrischen Leuten zu zeigen, dass es Forschungsbemühungen gab (als ob die Forschungsanstrengungen wichtig wären).
Einige Leute haben vorgeschlagen, ASP.net aufzurufen. co_de%, und aktualisieren Sie die PageMethods
in Client-JavaScript :
Problem hier ist das gleiche bei Versuch # 2. Der Viewstate wird falsch sein, weil ich mit der Form hinter dem Rücken von ASP.net muckte.
Es scheint ein fundamantales Problem zu geben, dass ASP.net und viewstate grundsätzlich nicht mit clientseitigen DOM-Updates kompatibel sind. Jeder Versuch, eine Seite clientseitig zu ändern, macht das gesamte ASP.net-Webformular-Programmiermodell ungültig.
Das Aktualisieren der DropDownList
-Steuerelemente mithilfe von JavaScript ändert nicht den Viewstatus, was bedeutet, dass in jedem Post die Änderungen außer Kraft gesetzt werden.
Ich habe etwas ähnliches gemacht, um JSON den Inhalt der Listen in versteckten Feldern zu serialisieren und dann in Server-Code auf jedem Beitrag zu deserialisieren
Dies ist eine Antwort, die ein vollständiges Arbeitsbeispiel zeigt, um etwas Ähnliches zu zeigen (überprüfen Sie die akzeptierte Antwort).
ASP.NET jQuery doppelte Listbox bearbeiten und speichern
BTW Um loszuwerden:
Ungültiges Postback- oder Callback-Argument.
Sie können die Viewstate-Validierung deaktivieren. Dies wird jedoch nicht empfohlen. Sie sollten dies nur tun, wenn Sie sich in einem Intranet befinden, in dem Sie die meiste Zeit den Benutzern vertrauen können
%Vor%Bezogen auf Versuch Nr. 1, um das Problem der Seitenposition zu lösen, können Sie versuchen, dies im aspx-Seitenheader
zu verwenden %Vor% und registrieren Sie ein Javascript in der Methode cbCountry_SelectedIndexChanged
, um den Fokus auf die Status-Combobox zu setzen.
Gehe zur Einstellung der Dropdown-Liste
Setzen Sie AutoPostBack = True,