Jak wypełnić asp: strona klienta DropDown?

Mam stronę internetową z dwoma<asp:DropDown> sterownica:

Gdy użytkownik wybierze aKraj chcę wypełnić listę stanów.

Próba # 1 - OnSelectedIndexChanged

Pierwsza rzecz była całkiem prosta: podczasOnSelectedIndexChanged pierwszej listy rozwijanej, wypełnij drugie pole:

//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;
}    

To działało dobrze, z wyjątkiem tego, że uruchamia odświeżanie strony. Użytkownik zostaje przerwany podczas wysyłania wiadomości, a strona jest ponownie ładowana. Strona nie jest już tam, gdzie ją zostawili, i nie siedzą już wewnątrz listy rozwijanej.

Attempt # 2 - Staroświeckie kludgey UpdatePanels

@Seglo wywołuje UpdatePanels w starym stylu. Ale ponieważ nie mogę znaleźć nic lepszego - spróbujmy! Zawijaj rzeczy w panelu aktualizacji i pozwól mu to zrobić:

Problem polega na tym, że gdyUpdatePanel aktualizacje, usuwa obie kontrolki i zastępuje je nowymi. Oznacza to, że użytkownik stracił koncentrację w pierwszej liście rozwijanej. Ludzie sugerowalistraszne kludy przy użyciu JavaScript, aby spróbować zapisać i przywrócić fokus. Ale wolałbym robić rzeczy poprawnie.

Próba # 3 - Tylko UpdatePanel to, czego potrzebujesz do aktualizacji

nie muszęaktualizacja Kraj rozwijane (ani etykiety). ja tylkopotrzeba zaktualizowaćStan upuścić; więc czemu nie zawinąćtylko to w<asp:UpdatePanel>. w rzeczywistościto jest odpowiedź sugerowana na StackOverflow:

I to działa. TheKraj lista rozwijana nie traci ostrości. TheOnSelectedIndexChanged pożary zdarzeń iStan rozwijane wypełnienia ...

... po raz pierwszy zmieniam listę rozwijaną kraju.

Jeśli zmienięKraj jeszcze raz, rzuca wyjątek:

Nieprawidłowy argument postback lub callback.

Jakoś takupdatepanel zakłóca kontrolki WebForms; unieważnienie danych postback. Ma to sens, ponieważ manipulowanie przy użyciu formantów WebForms powoduje, że dane postback są nieprawidłowe.

Próba # 4 - spróbuj sfałszować postback używając javascript

Nic ci nie zyskuje; aleludzie próbowali ręcznie wywołać postback przez javascript:

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

Z wyjątkiem bez znajomościClientID zcbCountry iUpdatePanel1, skrypt nie zostanie uruchomiony; nie wiem nawet, czy może rozwiązać mój problem

Próba # 5 - UżyjPageMethods aby pobrać listę stanów.

Teraz łączę tylko losowe sugestie innych osób. Zaimplementowanie jakiejkolwiek sugestii zajmuje mi około 4 godzin. Co oznacza, że ​​straciłem półtora dnia, próbując wypełnić pole kombi.

nie mogę sobie pozwolić na stracenie dnia na każdą przypadkową propozycję znalezioną w google; potrzebujęrzeczywisty odpowiedź. Włączam je więc tylko do pokazania złym ludziom, że były wysiłki badawcze (tak jakby wysiłek badawczy był ważny).

Trochęludzie sugerują wywołanie ASP.netPageMethodsi zaktualizujcbState w javascript klienta:

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);"

Problem jest taki sam w Attempt # 2. Stan widzenia będzie błędny, ponieważ zepsułem formularz za plecami ASP.net.

Wydaje się, że istnieje poważny problem, który ASP.net iwidok są zasadniczo niezgodne z aktualizacjami DOM po stronie klienta. Każda próba modyfikacji strony klienta powoduje unieważnienie całego modelu programowania formularzy internetowych ASP.net.

questionAnswers(5)

yourAnswerToTheQuestion