6

Tengo un control ASP.Net RadioButtonList con AutoPostBack establecido en verdadero. También tengo una función OnSelectedIndexChanged que se invoca cada vez que un usuario cambia la selección. Por último, el usuario está obligado a proporcionar la información solicitada para este control, así que tengo una selección por defecto cuando el usuario llega a la page--ASP.Net AJAX UpdatePanel no puede desencadenar el evento SelectedIndexChanged

<asp:RadioButtonList ID="rblHighestDegree" runat="server" AutoPostBack="true" 
     onselectedindexchanged="rblHighestDegree_SelectedIndexChanged"> 
    <asp:listitem Runat="server" Text="Master's Degree" Selected="True" /> 
    <asp:listitem Runat="server" Text="Doctorate" /> 
</asp:RadioButtonList> 

En el ejemplo de código anterior, cuando el usuario cambia desde el valor por defecto selección (por ejemplo, "Máster") a una opción diferente (por ejemplo, "Doctorado"), luego se desencadena el evento SelectedIndexChanged. Luego, si el usuario cambia de opinión y posteriormente selecciona la opción predeterminada original, el evento SelectedIndexChanged se activa nuevamente. Esto funciona exactamente como se esperaba y se espera.

que tienen un segundo control que puedo habilitar o inhabilitar, dependiendo de la selección anterior, en el código subyacente ...

<asp:ScriptManager ID="scriptmanager1" runat="server" /> 
<asp:UpdatePanel ID="updatepanel1" runat="server"> 
<ContentTemplate> 
<asp:RadioButtonList ID="rdlYearsOfStudy" runat="server" Enabled="false"> 
<asp:listitem Runat="server" Text="Less than 3 years" /> 
<asp:listitem Runat="server" Text="3 - 4 years" /> 
<asp:listitem Runat="server" Text="5 - 6 years" /> 
</asp:RadioButtonList> 
</ContentTemplate> 
<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="rblHighestDegree" EventName="SelectedIndexChanged" /> 
</Triggers> 
</asp:UpdatePanel> 

El problema que estoy teniendo sólo se produce solamente después coloqué este segundo control dentro de un ASP.Net AJAX UpdatePanel para habilitar una devolución de datos asincrónica (como se muestra arriba). Una vez que hice esto, el control RadioButtonList original solo será devuelto cuando selecciono un ListItem que fue no seleccionado por defecto cuando el usuario llegó a la página. Si el usuario selecciona posteriormente la selección predeterminada original, la devolución de datos no se produce.

Para aclarar, si transfiero datos sin colocar el segundo control aplicable en un ASP.Net AJAX UpdatePanel, entonces SelectedIndexChanged funciona sin importar qué RadioButtonList ListItem el usuario selecciona. Por otro lado, después de colocar un control dentro de un UpdatePanel para aplicar AsyncPostBackTrigger, la devolución de datos solo ocurre para selecciones de ListItems no predeterminados.

Más información que podría ser relevante es que estoy codificando con Microsoft Visual Studio 2008, y el control UpdatePanel que estoy usando es parte de la Librería AJAX de Microsoft (no del Kit de herramientas de control AJAX de ASP.NET).

Agradecería cualquier idea sobre cómo hacer funcionar ASP.Net AJAX, de modo que pueda lograr que el evento SelectedIndexChanged se active cuando un usuario selecciona los ListItems predeterminados o no predeterminados en RadioButtonList. Para el registro, traté de configurar la selección predeterminada de RadioButtonList en el evento page_load, pero no ayudó.

¡Gracias de antemano por cualquier ayuda!

+0

Tenga en cuenta que también intenté eliminar los desencadenantes definidos en la página aspx y, en su lugar, registré el control RadioButtonList en el evento page_load: "scriptmanager1.RegisterPostBackControl (rblHighestDegree);" Desafortunadamente, este enfoque resultó en el mismo comportamiento exacto del que me quejé anteriormente. – cjo30080

+0

Si observa el código HTML generado, verá que la radio seleccionada por defecto no tiene un onclick configurado para llamar a __doPostBack. –

Respuesta

4

Tuve el mismo problema y encontré que el HTML generado no tenía un manejador de clics en la selección predeterminada. Los otros botones de opción de la lista tienen manejadores de clics para llamar a __doPostBack. Por lo que añade este fragmento de jQuery:

$("#rbl input[checked]").click(function (e) 
{ 
    var id = e.target.id.replace('_', '$'); 
    setTimeout(function() { __doPostBack(id, ""); }, 0); 
}); 

Sin embargo, a pesar de que la llamada ajax estaba trabajando como se esperaba, el código del lado del servidor todavía no estaba ejecutando el manejador SelectedIndexChanged.

Pensando que podría ser porque el servidor sabe cuál es la selección predeterminada (era) y ve que la selección publicada es la misma y cree que el índice seleccionado no se modificó y no ejecutó el controlador.

Luego pensé que cuando se seleccionara una de las otras radios, el servidor debería haber recordado eso a través del estado de visualización. Lo que me hizo recordar que tenía viewstatemode="Disabled" en el contenedor de mi lista de botones de radio. Así que establecí viewstatemode="Enabled" en la lista de botones de radio y ahora está funcionando como se esperaba.

+0

Gracias por esta respuesta. Le di una oportunidad, pero desafortunadamente, establecer viewstatemode = "Enabled" en la lista de botones de la radio no modificó el comportamiento ni resolvió mi problema. – cjo30080

+0

Simplemente habilitar el ViewState no es suficiente. ¿Adjuntaste el manejador de clics del lado del cliente para llamar a __doPostBack? –

0

Tengo este problema, así que, resuelto de esta manera, debe establecer AutoPostBack y el controlador de eventos SelectedIndexChange en el código C# (Cargar página) y en la etiqueta html. por ejemplo:

protected void Page_Load(object sender, EventArgs e) 
    { 
      rblHighestDegree.AutoPostBack = true; 
      rblHighestDegree.SelectedIndexChanged += 
      new EventHandler (rblHighestDegree_SelectedIndexChanged); 
    } 

Y en HTML:

<asp:RadioButtonList ID="rblHighestDegree" runat="server" AutoPostBack="true" 
    onselectedindexchanged="rblHighestDegree_SelectedIndexChanged"> 
+0

solo estableciendo autopostback tot rue funcionó para mí ... –

0

que construyeron la lista de botones de radio en código detrás, ya la izquierda de la SelectedIndex = 0, entonces en proceso de carga llamé clic() del primer elemento utilizando JavaScript. Esto es lo más simple que funcionó para mí.

0

Sé que esta es una pregunta antigua, pero como dijo Jeff Shepler, no hay ningún controlador de clic para la opción predeterminada, y la devolución de datos parcial no creará una.

Me salvé esto envolviendo la primera lista de botones de radio en un nuevo panel de actualización con UpdateModel = "Always" (que es el valor predeterminado) por lo que se actualiza por cualquier devolución de datos.

No pude utilizar la solución de colocar ambas listas de botones en el mismo panel de actualización debido a la disposición del formulario en particular.

Cuestiones relacionadas