¿Cuándo es absolutamente lo último que puede llamar a Page.ClientScript.RegisterClientScriptBlock?

StackOverflow https://stackoverflow.com/questions/253267

Pregunta

Necesito mostrar un poco de JavaScript en un Control Web basado en algún procesamiento y algunas propiedades que el consumidor puede configurar, ya que la carga de la página será muy pronto.

¿Cuándo es el último que puedo llamar a RegisterClientScriptBlock y aún así tenerlo en la página?

¿Fue útil?

Solución

OnPreRender

o, si reemplaza Render .... antes de llamar a " base.Render "

Otros consejos

Antigua pregunta, pero recientemente traté esto, así que para aclarar un poco más la respuesta de Tim y aclarar la información errónea:

Si usa RegisterClientScriptBlock como lo está pidiendo, sus scripts se enviarán durante ClientScriptManager.RenderClientScriptBlocks, que se llama durante Page.BeginFormRender, pero en realidad es llamado por el Formulario, no por la propia Página.

Aquí está la secuencia:

  • Llamadas de Page.ProcessRequestMain (cuando llega a la sección de procesamiento)
  • (clase base de la página) Control.RenderControl que llama
  • Control.RenderChildren que recorre todos los controles secundarios y, finalmente, llama
  • HtmlForm.RenderControl que llama
  • HtmlForm.RenderChildren, que es lo que nos importa

Desde Reflector:

protected internal override void RenderChildren(HtmlTextWriter writer)
{
    Page page = this.Page;
    if (page != null)
    {
        page.OnFormRender();
        page.BeginFormRender(writer, this.UniqueID);
    }
    base.RenderChildren(writer);
    if (page != null)
    {
        page.EndFormRender(writer, this.UniqueID);
        page.OnFormPostRender();
    }
}

Observe las llamadas a page.BeginFormRender y page.EndFormRender. Entre ellos, el formulario llama a base.RenderChildren, que eventualmente llamará al método Render en su control de usuario personalizado. Entonces, para ser fiel a su pregunta original, no puede interactuar con la parte de secuencias de comandos de ClientScriptBlocks en ningún momento durante la secuencia de procesamiento de cualquier control secundario, ya que ya se enviaron a la secuencia de Respuesta. Usted puede agregar scripts a este bloque durante la secuencia de Render si está en el método Render de la página antes de llamar a base.Render, como lo menciona Tim, pero esto no funciona en un control secundario de ningún tipo .

Si solo tienes que trabajar con la secuencia de Renderizado (esta es la situación en la que me encuentro), puedes usar ClientScript.RegisterStartupScript durante el Render de tu control, ya que se llama RenderClientStartupScripts durante la página.EndFormRender, lo que sucede después de se le indica a sus controles que procesen, como puede ver en el código anterior.

Lógicamente, su script de inicio debe representarse y registrarse en la página, por lo que el evento Page_PreRender parece una buena apuesta. Después de eso, el código HTML y la secuencia de comandos de la página se 'bloquean'.

Incluso en la página principal, puedes llamarlo durante PreRender. La función Render de cada control se llama después del PreRender de la página principal, por lo que la función Render sería un lugar seguro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top