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 - OnSelectedIndexChangedPierwsza 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.
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 javascriptNic 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
PageMethods
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.netPageMethods
i 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.