¿Cómo llenar un lado de cliente asp: DropDown?

tengo una pagina web con dos<asp:DropDown> controles:

Cuando el usuario selecciona unPaís Quiero llenar la lista de estados.

Intento # 1 - OnSelectedIndexChanged

Lo primero fue bastante simple: duranteOnSelectedIndexChanged del primer desplegable, llene la segunda casilla:

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

Eso funcionó bastante bien, excepto que activa una actualización de la página. El usuario se interrumpe mientras se envía la publicación y la página se vuelve a cargar. Y la página ya no está donde la dejaron, y ya no están dentro del menú desplegable.

Intento # 2 - Paneles de actualización de kludgey pasados ​​de moda

@Seglo llama a UpdatePanels un kludge pasado de moda. Pero como no puedo encontrar nada mejor, ¡probémoslo! Envuelve el material en un panel de actualización y deja que haga su magia:

El problema con eso es que cuando elUpdatePanel Actualiza, elimina ambos controles y los reemplaza por otros nuevos. Esto significa que el usuario ha perdido su enfoque en el primer menú desplegable. La gente ha sugeridokludges horribles usando javascript para intentar guardar y restaurar el enfoque. Pero prefiero hacer las cosas correctamente.

Intento n. ° 3: solo UpdatePanel lo que necesita actualizar

no necesitoactualizar laPaís desplegable (ni las etiquetas). yo solonecesitar para actualizar elEstado desplegable; así que ¿por qué no envolversolamente que en un<asp:UpdatePanel>. De hechoEsta es la respuesta sugerida en StackOverflow.:

Y eso funciona. losPaís El menú desplegable no pierde el foco. losOnSelectedIndexChanged evento de incendios, y laEstado el desplegable se llena ...

... la primera vez que cambio el menú desplegable del país.

Si cambio elPaís otra vez, lanza una excepción:

Argumento de devolución de llamada o devolución de llamada no válido.

De alguna manera elpanel de actualización está jugando con los controles de los formularios web; haciendo inválidos los datos de devolución. Esto tiene sentido, ya que el jugar con los controles de WebForms hace que los datos de devolución de datos no sean válidos.

Intento n. ° 4: intente falsificar una devolución de mi mismo utilizando javascript

No te gana nada; peroLa gente ha intentado activar una devolución de datos manualmente a través de JavaScript:

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

Excepto sin saber elClientID decbCountry yUpdatePanel1, el script no se ejecutará; ni siquiera sé si puede resolver mi problema

Intento # 5 - UsoPageMethods para buscar la lista de estados.

Ahora solo estoy vinculando sugerencias al azar de otras personas. Me toma alrededor de 4 horas tratar de implementar cualquier sugerencia. Lo que significa que he perdido un día y medio tratando de llenar un cuadro combinado.

No puedo permitirme perder un día con cada sugerencia aleatoria que encuentro en google; necesito unreal responder. Así que solo los incluyo para mostrar a las personas gruñonas que hubo un esfuerzo de investigación (como si el esfuerzo de investigación fuera importante).

AlgunosLa gente ha sugerido llamar a ASP.netPageMethods, y actualizar elcbState en 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);"

El problema aquí es el mismo en el intento # 2. El estado de visualización será incorrecto porque he cancelado el formulario detrás de la parte posterior de ASP.net.

Parece que hay un problema fundamental que ASP.net yestado de vista son fundamentalmente incompatibles con las actualizaciones de DOM del lado del cliente. Cualquier intento de modificar una página del lado del cliente invalida todo el modelo de programación de formularios web de ASP.net.

Respuestas a la pregunta(5)

Su respuesta a la pregunta