Как заполнить asp: DropDown на стороне клиента?

у меня есть веб-страница с двумя<asp:DropDown> управления:

enter image description here

Когда пользователь выбирает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 старомодным клуджем, Но так как я не могу найти ничего лучше - попробуем! Оберните материал в панель обновлений и позвольте ему творить чудеса:

enter image description here

Проблема в том, что когдаUpdatePanel обновлений, он удаляет оба элемента управления и заменяет их новыми. Это означает, что пользователь потерял фокус в первом раскрывающемся списке. Люди предложилиужасные кладжи с использованием JavaScript, чтобы попытаться сохранить и восстановить фокус, Но я бы предпочел сделать все правильно.

Attempt #3 - Only UpdatePanel what you need to Update

мне не нужноupdate Country выпадающий (ни метки). только яneed обновитьState падать; так почему бы не завернутьonly что в<asp:UpdatePanel>, по фактуэто ответ, предложенный на StackOverflow:

enter image description here

И это работает.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скрипт не запустится; и при этом я даже не знаю, может ли это решить мою проблему

Attempt #5 - Use 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.

Ответы на вопрос(5)

Ваш ответ на вопрос