Quando é o absoluto mais recente você pode chamar Page.ClientScript.RegisterClientScriptBlock?
-
05-07-2019 - |
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?
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.