我需要在WebControl中根据一些处理和一些消费者可以设置的属性输出一些JavaScript,在页面加载时这样做会很早。
最新的什么时候我可以调用RegisterClientScriptBlock并在页面上输出它?
答案 0 :(得分:6)
老问题,但我最近处理了这个问题,所以要给蒂姆的答案一点澄清,并澄清一点错误信息:
如果您正在使用RegisterClientScriptBlock,那么您的脚本将在Client.Manager(在.BeginFormRender期间调用)期间输出 - 但它实际上是由Form调用的,而不是由Page本身调用。
以下是序列:
来自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();
}
}
注意对page.BeginFormRender和page.EndFormRender的调用。在它们之间,表单调用它的base.RenderChildren,它最终将在您的自定义用户控件上调用Render方法。因此,要忠实于原始问题,在任何子控件的渲染序列中,您都不能随时与脚本的ClientScriptBlocks部分进行交互,因为它们已经输出到Response流。如果您在调用base.Render之前使用Page的Render方法,那么可以在渲染序列期间向此块添加脚本,正如Tim所提到的,但这在任何类型的子控件中都不起作用
如果渲染序列是您必须使用的全部(这就是我所处的情况),那么您可以在控件的渲染期间使用ClientScript.RegisterStartupScript,因为在page.EndFormRender期间调用了RenderClientStartupScripts,其发生在之后,您的控件被告知要渲染,正如您在上面的代码中所看到的那样。
答案 1 :(得分:3)
的OnPreRender
或者,如果你在调用“base.Render”之前覆盖了Render ....
答案 2 :(得分:1)
逻辑上,您的启动脚本需要在页面上进行渲染以及注册,因此Page_PreRender事件似乎是一个不错的选择。之后,页面的HTML和脚本被“锁定”。
答案 3 :(得分:1)
即使在主页面上,您也可以在PreRender期间调用它。每个控件的渲染功能都在主页面的PreRender之后调用,因此渲染功能将是一个安全的地方。