Quando é o absoluto mais recente você pode chamar Page.ClientScript.RegisterClientScriptBlock?

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

Pergunta

Eu preciso de saída um pouco de JavaScript em um WebControl baseado em algum processamento e algumas propriedades que o consumidor pode definir, fazê-lo na carga da página será mais cedo.

Quando é a última que eu posso chamar RegisterClientScriptBlock e ainda ter que saída na página?

Foi útil?

Solução

OnPreRender

ou, se você substituir rende .... antes de chamar "base.Render"

Outras dicas

velha questão, mas eu recentemente lidado com isso, de modo a dar resposta de Tim um pouco mais esclarecimentos e esclarecer o pouco de desinformação:

Se você usa RegisterClientScriptBlock como você está pedindo, em seguida, seus scripts será emitido durante ClientScriptManager.RenderClientScriptBlocks, que é chamado durante Page.BeginFormRender -. Mas na verdade é chamado pelo formulário, e não pela própria página

Eis a seqüência:

  • Page.ProcessRequestMain (quando atinge o ponto rendem) chama
  • (classe base da página) Control.RenderControl que chamadas
  • Control.RenderChildren que percorre todos os controles filho e, eventualmente, chama
  • HtmlForm.RenderControl que chamadas
  • HtmlForm.RenderChildren que é o que nós nos preocupamos

De refletor:

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 as chamadas para page.BeginFormRender e page.EndFormRender. Entre eles, o formulário chama é base.RenderChildren o que acabará por chamar o método de processamento em seu usuário personalizada de controle. Assim, para ser fiel à sua pergunta original, você não pode interagir com a porção ClientScriptBlocks de scripts em qualquer momento durante qualquer controle filho é renderização sequência uma vez que já estive saída para o fluxo de resposta. Você pode adicionar scripts para este bloco durante a seqüência de renderização se você estiver no método Render da página antes de chamar base.Render, como Tim menciona, mas isso não funciona em um controle filho de qualquer tipo .

Se a renderização sequência é tudo que você tem que trabalhar com (esta é a situação que eu estou em), então você pode usar ClientScript.RegisterStartupScript durante o seu controle de Render, como os RenderClientStartupScripts é chamado durante page.EndFormRender, que acontece depois seus controles são orientados a render, como você pode ver no código acima.

Logicamente, as suas necessidades de script de inicialização a serem prestados, bem como registrados na página, então o evento Page_PreRender parece ser uma boa aposta. Depois que o HTML e script para a página for 'fechado'.

Mesmo na página principal, você pode chamá-lo durante PreRender. Cada controle é renderização função é chamada depois da página PreRender, então a renderização função seria um lugar seguro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top