Estoy teniendo lo que creo que debería ser un problema bastante simple, pero por mi vida no puedo ver mi problema. El problema está relacionado con ScriptManager.RegisterStartupScript, algo que he usado muchas veces antes.No se puede obtener ScriptManager.RegisterStartupScript en WebControl anidado en UpdatePanel para trabajar
El escenario que tengo es que tengo un control web personalizado que se ha insertado en una página. El control (y uno o dos más) están anidados dentro de un UpdatePanel. Se insertan en la página en un marcador de posición:
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
Este es el único panel de actualización en la página.
El control requiere que se ejecute algún javascript inicial para que funcione correctamente. Las llamadas de control:
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
y también he intentado:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
El problema es que el script se ejecuta correctamente cuando se muestra por primera vez la página, pero no vuelve a funcionar después de una devolución de datos parcial. He intentado lo siguiente:
- Calling RegisterStartupScript de CreateChildControls
- Calling RegisterStartupScript de OnLoad/OnPreRender
- El uso de diferentes combinaciones de parámetros para los dos primeros parámetros (en el ejemplo anterior, el control es la página y Tipo GetType(), pero he intentado usar el control mismo, etc.).
- He intentado usar identificadores nuevos y persistentes (aunque no creo que esto tenga un impacto importante).
- He utilizado algunos puntos de interrupción y he verificado que la línea de registro se está llamando correctamente.
Lo único que no he probado es utilizar el UpdatePanel como Control y Type, ya que no creo que el control tenga en cuenta el panel de actualización (y en cualquier caso no parece haber un buena forma de obtener el panel de actualización?).
¿Alguien puede ver lo que podría estar haciendo mal en lo de arriba?
Gracias :)
Bueno, para responder a la consulta anterior - que parece como si el marcador de posición de alguna manera arruina la ScriptManager.RegisterStartupScript.
Cuando retiro el control del marcador de posición y lo codigo directamente en la página, la secuencia de comandos Register funciona correctamente (también estoy usando el control como parámetro).
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
¿Alguien puede arrojar alguna luz sobre por qué un control se inyectó en un marcador de posición evitaría que el ScriptManager de registrar correctamente el guión? Supongo que esto podría tener algo que ver con el ciclo de vida de los controles dinámicos, pero agradecería (por mi propio conocimiento) si hay un proceso correcto para lo anterior.
Hola Ben, gracias por la respuesta. Por el momento, el script simplemente activa una alerta, nada más. Es un control de cuadrícula, que hereda la cuadrícula de datos. Normalmente usaría Firefox/Bug, pero en este caso estoy trabajando en una aplicación exclusiva de IE (no es mi elección), no podré acceder a la pantalla en FF. Utilizando la barra de herramientas de IE Dev puedo examinar la página, pero el script no se ha vuelto a registrar en la devolución de datos. Me gusta la idea de PageRequestManager, aunque el script no se expone fácilmente a la página para llamar como controlador.Me gustan las ideas y las usaré para investigar más a fondo, gracias – Chris