Wie fülle ich einen asp: DropDown-Client?

Ich habe eine Webseite mit zwei<asp:DropDown> Kontrollen:

Wenn der Benutzer a auswähltLand Ich möchte die Liste der Staaten füllen.

Versuch 1 - OnSelectedIndexChanged

Das erste war ziemlich einfach: währendOnSelectedIndexChanged Füllen Sie im ersten Dropdown-Menü das zweite Feld aus:

//be sure to set AutoPostBack of cbCountry to true in the properties window

protected void cbCountry_SelectedIndexChanged(object sender, EventArgs e)
{
   cbState.Items.Clear();
   FetchStatesForCountryIntoStateDropDown(cbState, cbCountry.SelectedValue);
   if (cbState.Items.Count > 0)
      cbState.SelectedIndex = 0;
}    

Das hat gut funktioniert, außer dass es eine Seitenaktualisierung auslöst. Der Benutzer wird unterbrochen, während der Beitrag gesendet wird, und die Seite wird neu geladen. Und die Seite ist nicht mehr dort, wo sie sie verlassen hat, und sie sitzen nicht mehr im Dropdown-Menü.

Versuch Nr. 2 - Altmodische kludgey UpdatePanels

@Seglo nennt UpdatePanels einen altmodischen Kludge. Aber da ich nichts besseres finden kann - lass es uns versuchen! Packen Sie das Zeug in ein Update-Panel und lassen Sie es zaubern:

Das Problem dabei ist, dass beimUpdatePanel Aktualisierungen werden beide Steuerelemente gelöscht und durch neue ersetzt. Dies bedeutet, dass der Benutzer in der ersten Dropdown-Liste seinen Fokus verloren hat. Die Leute haben vorgeschlagenschreckliche kludges mit Javascript, um zu versuchen, den Fokus zu speichern und wiederherzustellen. Aber ich mache die Dinge lieber richtig.

Versuch 3 - Nur UpdatePanel, was Sie zum Aktualisieren benötigen

das brauche ich nichtaktualisieren dasLand Dropdown (noch die Etiketten). ich nurbrauchen um das zu aktualisierenZustand Dropdown-Liste; Warum also nicht wickeln?nur das in einem<asp:UpdatePanel>. EigentlichDies ist die auf StackOverflow vorgeschlagene Antwort:

Und das funktioniert. DasLand Dropdown verliert nicht den Fokus. DasOnSelectedIndexChanged Ereignisfeuer und dieZustand Dropdown-Füllungen ...

... das erste mal, dass ich das Länder-Dropdown ändere.

Wenn ich das ändereLand nochmal, wirft es eine Ausnahme:

Ungültiges Postback- oder Callback-Argument.

Irgendwie dasupdatepanel spielt mit den WebForms-Steuerelementen herum; Machen Sie die Postback-Daten ungültig. Dies ist sinnvoll, da durch das Durcheinander mit WebForms-Steuerelementen die Postback-Daten ungültig werden.

Versuch 4 - Versuchen Sie, ein Postback selbst mit Javascript zu fälschen

Es bringt dir nichts; aberLeute haben versucht, ein Postback manuell über Javascript auszulösen:

$('#userControl1').on('focusout', function() {
     __doPostback('UpdatePanel2UniqueId', '');
});

Außer ohne das zu wissenClientID voncbCountry undUpdatePanel1wird das Skript nicht ausgeführt; Ich weiß auch nicht, ob es mein Problem lösen kann

Versuch Nr. 5 - VerwendenPageMethods um die Statusliste abzurufen.

Jetzt verbinde ich nur die zufälligen Vorschläge anderer Leute. Ich brauche ungefähr 4 Stunden, um einen Vorschlag umzusetzen. Das heißt, ich habe anderthalb Tage verloren, als ich versucht habe, ein Kombinationsfeld zu füllen.

Ich kann es mir nicht leisten, einen Tag bei jedem zufälligen Vorschlag zu verlieren, den ich bei Google finde. Ich brauche einetatsächlich Antworten. Also beziehe ich sie nur ein, um den mürrischen Leuten zu zeigen, dass es Forschungsaufwand gab (als ob Forschungsaufwand wichtig wäre).

EtwasLeute haben vorgeschlagen, ASP.net anzurufenPageMethodsund aktualisieren Sie diecbState im Client Javascript:

function GetStates(country)
{
    PageMethods.GetTeam(teamCode, CountryCallback);
}

function CountryCallback(result)
{
    var teamName = $get('TeamName');
    var seed = $get('Seed');
    var rpi = $get('RPI');
    var scoutingReport = $get('ScoutingReport');
    teamName.innerText = result.TeamName;
    seed.innerText = result.Seed;
    rpi.innerText = result.RPI;
    scoutingReport.innerText = result.ScoutingReport;
}

onchange="GetTeam(this.options[this.selectedIndex].value);"

Das Problem hier ist dasselbe bei Versuch Nr. 2. Der Viewstate wird falsch sein, weil ich mich mit dem Formular hinter dem Rücken von ASP.net herumgetrieben habe.

Es scheint ein grundlegendes Problem zu geben, das ASP.net undSichtzustand sind grundsätzlich nicht mit clientseitigen DOM-Updates kompatibel. Jeder Versuch, eine Seite clientseitig zu ändern, macht das gesamte Programmiermodell für ASP.net-Webformulare ungültig.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage