Как заполнить asp: DropDown на стороне клиента?
у меня есть веб-страница с двумя<asp:DropDown>
управления:
Когда пользователь выбираетCountry я хочу заполнить список штатов.
Attempt #1 - OnSelectedIndexChangedПервое было довольно просто: во времяOnSelectedIndexChanged
из первого раскрывающегося списка заполните второе поле:
//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;
}
Это сработало достаточно хорошо, за исключением того, что оно вызывает обновление страницы. Пользователь прерывается во время отправки сообщения, и страница перезагружается. И страница больше не там, где они ее оставили, и они больше не сидят внутри выпадающего списка.
Attempt #2 - Old fashioned kludgey UpdatePanels@Seglo называет UpdatePanels старомодным клуджем, Но так как я не могу найти ничего лучше - попробуем! Оберните материал в панель обновлений и позвольте ему творить чудеса:
Проблема в том, что когдаUpdatePanel
обновлений, он удаляет оба элемента управления и заменяет их новыми. Это означает, что пользователь потерял фокус в первом раскрывающемся списке. Люди предложилиужасные кладжи с использованием JavaScript, чтобы попытаться сохранить и восстановить фокус, Но я бы предпочел сделать все правильно.
мне не нужноupdate Country выпадающий (ни метки). только яneed обновитьState падать; так почему бы не завернутьonly что в<asp:UpdatePanel>
, по фактуэто ответ, предложенный на StackOverflow:
И это работает.Country раскрывающийся список не теряет фокуса.OnSelectedIndexChanged
события пожары, иState выпадающий список заполняет ...
... в первый раз я меняю раскрывающийся список стран.
Если я изменюCountry againВыдает исключение:
Invalid postback or callback argument.
Каким-то образомupdatepanel возится с элементами управления WebForms; делает данные обратной передачи недействительными. Это имеет смысл, так как путаница с элементами управления WebForms делает данные обратной передачи недействительными.
Attempt #4 - Try faking a postback myself using javascriptЭто ничего вам не даст; нолюди пытались вызвать постбэк вручную через javascript:
$('#userControl1').on('focusout', function() {
__doPostback('UpdatePanel2UniqueId', '');
});
За исключением того, что не знаяClientID
изcbCountry
а такжеUpdatePanel1
скрипт не запустится; и при этом я даже не знаю, может ли это решить мою проблему
PageMethods
to fetch the State list.
Теперь я только связываю случайные предложения других людей. У меня уходит около 4 часов, чтобы попытаться реализовать любое предложение. Это означает, что я потерял полтора дня, пытаясь заполнить поле со списком.
я не могу позволить себе потерять день на каждое случайное предложение, найденное в Google; мне нуженactual ответ. Поэтому я включаю их только для того, чтобы показать сварливым людям, что проводились исследования (как будто исследования были важны).
Немноголюди предложили позвонить в ASP.netPageMethods
, and update the cbState
in 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);"
Проблема здесь та же при попытке № 2. Состояние просмотра будет неправильным, потому что я испортил форму за спиной ASP.net.
Кажется, есть фундаментальная проблема, что ASP.net иviewstate принципиально несовместимы с обновлениями DOM на стороне клиента. Любая попытка изменить страницу на стороне клиента делает недействительной всю модель программирования веб-форм ASP.net.