Como preencher um asp: lado do cliente DropDown?

Eu tenho uma página web com dois<asp:DropDown> controles:

Quando o usuário seleciona umPaís Eu quero preencher a lista de estados.

Tentativa # 1 - OnSelectedIndexChanged

A primeira coisa foi bem simples: duranteOnSelectedIndexChanged da primeira lista suspensa, preencha a segunda caixa:

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

Isso funcionou bem o suficiente, exceto que ele aciona uma atualização de página. O usuário é interrompido enquanto a postagem é enviada e a página é recarregada. E a página não está mais onde eles a deixaram, e eles não estão mais dentro da lista suspensa.

Tentativa # 2 - UpdatePanels kludgey à moda antiga

@Seglo chama UpdatePanels de um kludge antiquado. Mas desde que eu não consigo encontrar nada melhor - vamos tentar! Enrole o material em um painel de atualização e deixe que ele seja mágico:

O problema com isso é que quando oUpdatePanel atualizações, exclui ambos os controles e os substitui por novos. Isso significa que o usuário perdeu o foco no primeiro menu suspenso. As pessoas sugeriramhludges horríveis usando javascript para tentar salvar e restaurar o foco. Mas eu prefiro fazer as coisas corretamente.

Tentativa # 3 - somente UpdatePanel o que você precisa atualizar

eu não precisoatualizar aPaís dropdown (nem os rótulos). eu apenasprecisar para atualizar oEstado suspenso; então porque não embrulharsó que em um<asp:UpdatePanel>. De fatoesta é a resposta sugerida no StackOverflow:

E isso funciona. oPaís O menu suspenso não perde o foco. oOnSelectedIndexChanged incêndios de eventos eEstado dropdown preenche ...

... a primeira vez que mudo o menu suspenso do país.

Se eu mudar oPaís novamente, lança uma exceção:

Inválido postback ou argumento de retorno de chamada.

De alguma forma oupdatepanel está mexendo com os controles WebForms; tornando os dados de postback inválidos. Isso faz sentido, já que mexer com controles WebForms torna os dados de postback inválidos.

Tentativa nº 4: tente falsificar um postback usando o javascript

Não te ganha nada; masas pessoas tentaram disparar um postback manualmente através do javascript:

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

Exceto sem conhecer oClientID docbCountry eUpdatePanel1, o script não será executado; nem sei se pode resolver meu problema

Tentativa # 5 - UsePageMethods para buscar a lista de estados.

Agora estou ligando apenas sugestões aleatórias de outras pessoas. Demoro cerca de 4 horas para tentar implementar qualquer sugestão. O que significa que perdi um dia e meio tentando preencher uma caixa de combinação.

Eu não posso perder um dia em cada sugestão aleatória que eu encontro no google; eu preciso de umreal responda. Então eu estou apenas incluindo-os para mostrar às pessoas mal-humoradas que houve um esforço de pesquisa (como se o esforço de pesquisa fosse importante).

Algunspessoas sugeriram chamar ASP.netPageMethodse atualizar ocbState no cliente 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);"

Problema aqui é o mesmo na Tentativa # 2. O viewstate estará errado porque eu mucked com o formulário por trás do ASP.net de volta.

Parece haver um problema fundamantal que ASP.net eviewstate são fundamentalmente incompatíveis com as atualizações do DOM do lado do cliente. Qualquer tentativa de modificar uma página do lado do cliente invalida todo o modelo de programação de formulários da Web do asp.net.

questionAnswers(5)

yourAnswerToTheQuestion