什么时候绝对最新你可以调用Page.ClientScript.RegisterClientScriptBlock?

时间:2008-10-31 12:04:15

标签: c# asp.net javascript web-controls

我需要在WebControl中根据一些处理和一些消费者可以设置的属性输出一些JavaScript,在页面加载时这样做会很早。

最新的什么时候我可以调用RegisterClientScriptBlock并在页面上输出它?

4 个答案:

答案 0 :(得分:6)

老问题,但我最近处理了这个问题,所以要给蒂姆的答案一点澄清,并澄清一点错误信息:

如果您正在使用RegisterClientScriptBlock,那么您的脚本将在Client.Manager(在.BeginFormRender期间调用)期间输出 - 但它实际上是由Form调用的,而不是由Page本身调用。

以下是序列:

  • Page.ProcessRequestMain(当它到达渲染部分时)调用
  • (Page的基类)调用
  • 的Control.RenderControl
  • Control.RenderChildren循环遍历所有子控件并最终调用
  • 调用
  • 的HtmlForm.RenderControl
  • HtmlForm.RenderChildren这是我们关心的事情

来自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之后调用,因此渲染功能将是一个安全的地方。