page net mensajes mensaje isstartupscriptregistered funciona existe contexto confirmacion asp alerta actual c# asp.net ajax updatepanel scriptmanager

c# - isstartupscriptregistered - mensajes javascript en asp net



No se puede obtener ScriptManager.RegisterStartupScript en WebControl anidado en UpdatePanel para funcionar (10)

Estoy teniendo lo que creo 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.

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 PlaceHolder:

<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 un 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 la secuencia de comandos se ejecuta correctamente cuando la página se muestra por primera vez, pero no se vuelve a ejecutar después de una devolución de datos parcial. He probado lo siguiente:

  1. Llamar a RegisterStartupScript desde CreateChildControls
  2. Llamar a RegisterStartupScript desde OnLoad / OnPreRender
  3. Usando diferentes combinaciones de parámetros para los primeros dos parámetros (en el ejemplo anterior, el Control es Página y Tipo es GetType (), pero he intentado usar el control mismo, etc.).
  4. He intentado usar identificadores persistentes y nuevos (aunque no creo que esto tenga un gran impacto en ambos sentidos).
  5. He usado algunos puntos de interrupción y he verificado que la línea de registro se está llamando correctamente.

Lo único que no he intentado es utilizar el UpdatePanel en sí mismo como Control y Type, ya que no creo que el control deba conocer el panel de actualización (y, en cualquier caso, no parece haber una buena forma de obtener la actualización). ¿panel?).

¿Alguien puede ver lo que podría estar haciendo mal en lo de arriba?

Gracias :)

Bueno, para responder a la consulta anterior, parece como si el marcador de posición de alguna manera ensuciara el 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 inyectado en un PlaceHolder evitaría que el ScriptManager registrara correctamente el script? 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.


Algunas veces no se activa cuando el script tiene algún error de sintaxis, asegúrese de que el script y la sintaxis de javascript sean correctos.


Creo que deberías estar usando la sobrecarga de control de RegisterStartupScript.

Probé el siguiente código en un control de servidor:

[ToolboxData("<{0}:AlertControl runat=server></{0}:AlertControl>")] public class AlertControl : Control{ protected override void OnInit(EventArgs e){ base.OnInit(e); string script = "alert(/"Hello!/");"; ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script, true); } }

Luego en mi página tengo:

protected override void OnInit(EventArgs e){ base.OnInit(e); Placeholder1.Controls.Add(new AlertControl()); }

Donde Placeholder1 es un marcador de posición en un panel de actualización. El marcador de posición tiene un par de controles más, incluidos botones.

Esto se comportó exactamente como era de esperar, recibí una alerta que decía "Hola" cada vez que cargaba la página o causaba que el panel de actualización se actualizara.

La otra cosa que podría ver es enganchar en algunos de los eventos del ciclo de vida de la página que se activan durante una solicitud del panel de actualización:

Sys.WebForms.PageRequestManager.getInstance() .add_endRequest(EndRequestHandler);

El evento PageRequestManager endRequestHandler se activa cada vez que un panel de actualización completa su actualización; esto le permitiría llamar a un método para configurar su control.

Mis únicas otras preguntas son:

  • ¿Qué está haciendo realmente tu script?
  • Presumiblemente, puede ver el script en el código HTML en la parte inferior de la página (justo antes de la etiqueta de cierre </ form>).
  • ¿Has intentado poner algunas "alertas" ("Aquí")? " llama en su script de inicio para ver si se está llamando correctamente?
  • ¿Has probado Firefox y Firebug ? ¿Es eso informar cualquier error de script?

Cuando se llama a ScriptManager.RegisterStartupScript, el parámetro "Control" debe ser un control que se encuentre dentro de un UpdatePanel que se actualizará. Debes cambiarlo a:

ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), script, true);


Intento muchas cosas y finalmente encuentro que el último parámetro debe ser falso y debes agregar la etiqueta <SCRIPT> al script java:

string script = "< SCRIPT >alert(''hello!'');< /SCRIPT>"; ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), key, script, **false**);


La solución es colocar los scripts en un archivo js externo (llamemos ''yourDynamic.js'') y vuelva a registrar el archivo cada vez que actualice el panel de actualización.

Lo uso en el evento updatepanel_prerender:

ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "UpdatePanel1_PreRender", _ "<script type=''text/javascript'' id=''UpdatePanel1_PreRender''>" & _ "include(''yourDynamic.js'');" & _ "removeDuplicatedScript(''UpdatePanel1_PreRender'');</script>" _ , False)

En la página o en alguna otra inclusión, necesitarás este javascript:

// Include a javascript file inside another one. function include(filename) { var head = document.getElementsByTagName(''head'')[0]; var scripts = document.getElementsByTagName(''script''); for(var x=0;x<scripts.length;> { if (scripts[x].getAttribute(''src'')) { if(scripts[x].getAttribute(''src'').indexOf(filename) != -1) { head.removeChild(scripts[x]); break; } } } script = document.createElement(''script''); script.src = filename; script.type = ''text/javascript''; head.appendChild(script) } // Removes duplicated scripts. function removeDuplicatedScript(id) { var count = 0; var head = document.getElementsByTagName(''head'')[0]; var scripts = document.getElementsByTagName(''script''); var firstScript; for(var x=0;x<scripts.length;> { if (scripts[x].getAttribute(''id'')) { if(scripts[x].getAttribute(''id'').indexOf(id) != -1) { if (count == 0) { firstScript = scripts[x]; count++; } else { head.removeChild(firstScript); firstScript = scripts[x]; count = 1; } } } } clearAjaxNetJunk(); } // Evoids the update panel auto generated scripts to grow to inifity. X-( function clearAjaxNetJunk() { var knowJunk = ''Sys.Application.add_init(function() {''; var count = 0; var head = document.getElementsByTagName(''head'')[0]; var scripts = document.getElementsByTagName(''script''); var firstScript; for(var x=0;x<scripts.length;> { if (scripts[x].textContent) { if(scripts[x].textContent.indexOf(knowJunk) != -1) { if (count == 0) { firstScript = scripts[x]; count++; } else { head.removeChild(firstScript); firstScript = scripts[x]; count = 1; } } } } }

Muy bien, ah ... jejeje Esta parte de lo que publiqué hace un tiempo aquí .

Espero que esto ayude... :)


Lo que funcionó para mí, es registrarlo en la página al especificar el tipo como el de UpdatePanel, así:

ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UpdatePanel) Guid.NewGuid().ToString(), myScript, true);


NO use GUID para clave

ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UpdatePanel) Guid.NewGuid().ToString(), myScript, true);

y si quieres hacer eso, llama a Something Like this function

public static string GetGuidClear(string x) { return x.Replace("-", "").Replace("0", "").Replace("1", "") .Replace("2", "").Replace("3", "").Replace("4", "") .Replace("5", "").Replace("6", "").Replace("7", "") .Replace("8", "").Replace("9", ""); }


Tuve un problema al usar esto en un control de usuario (en una página esto funcionó bien); el Button1 está dentro de un updatepanel , y el scriptmanager está en el scriptmanager .

protected void Button1_Click(object sender, EventArgs e) { string scriptstring = "alert(''Welcome'');"; ScriptManager.RegisterStartupScript(this, this.GetType(), "alertscript", scriptstring, true); }

Ahora parece que tienes que tener cuidado con los primeros dos argumentos, necesitan hacer referencia a tu página, no a tu control

ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "alertscript", scriptstring, true);


Tuve un problema con Page.ClientScript.RegisterStartUpScript: no estaba usando un panel de actualización, pero el control estaba en la memoria caché. Esto significaba que tenía que insertar la secuencia de comandos en un Literal (o podría usar un PlaceHolder), por lo que cuando se procesa desde la memoria caché, se incluye la secuencia de comandos.

Una solución similar podría funcionar para usted.


ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(),script, true );

El valor de parámetro "verdadero" al final de ScriptManager.RegisterStartupScript agregará una etiqueta de JavaScript dentro de su página:

<script language=''javascript'' defer=''defer''>your script</script >

Si el valor será "falso", inyectará solo el script sin la etiqueta --script--.