Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时';您可以调用Page.ClientScript.RegisterClientScriptBlock的最新版本是什么?_C#_Asp.net_Javascript_Web Controls - Fatal编程技术网

C# 何时';您可以调用Page.ClientScript.RegisterClientScriptBlock的最新版本是什么?

C# 何时';您可以调用Page.ClientScript.RegisterClientScriptBlock的最新版本是什么?,c#,asp.net,javascript,web-controls,C#,Asp.net,Javascript,Web Controls,我需要根据一些处理和消费者可以设置的一些属性,在WebControl中输出一些JavaScript,在加载页面时这样做会很早 我可以调用RegisterClientScriptBlock并将其输出到页面上的最新时间是什么时候?OnPreRender 或者,如果覆盖渲染。。。。在逻辑上调用“base.Render”之前,启动脚本需要在页面上呈现和注册,因此页面预呈现事件似乎是一个不错的选择。在此之后,页面的HTML和脚本被“锁定”。即使在主页上,也可以在预渲染期间调用它。每个控件的呈现函数都是在主

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

我可以调用RegisterClientScriptBlock并将其输出到页面上的最新时间是什么时候?

OnPreRender


或者,如果覆盖渲染。。。。在逻辑上调用“base.Render”之前,启动脚本需要在页面上呈现和注册,因此页面预呈现事件似乎是一个不错的选择。在此之后,页面的HTML和脚本被“锁定”。

即使在主页上,也可以在预渲染期间调用它。每个控件的呈现函数都是在主页的预呈现之后调用的,因此呈现函数将是一个安全的地方。

以前的问题,但我最近处理了这个问题,因此为了给Tim的答案更清楚一点,澄清一些错误信息:

如果像您所要求的那样使用RegisterClientScriptBlock,那么您的脚本将在ClientScriptManager.RenderClientScriptBlocks期间输出,这是在Page.BeginInformRender期间调用的,但它实际上是由表单调用的,而不是由页面本身调用的

以下是顺序:

  • Page.ProcessRequestMain(当它到达呈现部分时)调用
  • (页面的基类)Control.RenderControl调用
  • Control.RenderChildren,它在所有子控件中循环并最终调用
  • HtmlForm.RenderControl调用
  • 我们关心的是HtmlForm.RenderChildren
从反射器:

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部分交互,因为它们已经输出到响应流。如Tim所述,如果在调用base.Render之前处于页面的Render方法中,则可以在呈现序列期间向该块添加脚本,但这在任何类型的子控件中都不起作用


如果渲染序列是您必须处理的全部(这是我所处的情况),那么您可以在控件渲染期间使用ClientScript.RegisterStartupScript,因为在page.EndFormRender期间调用RenderClientStartupScripts,这发生在您的控件被告知渲染之后,正如您在上面的代码中所看到的。

他要求在网络控件中执行此操作,因此您不能在渲染期间执行此操作。如果您在页面上覆盖呈现,那么是的,您的“或”建议有效“在主页的预呈现之前调用每个控件的呈现函数”--请告诉我这是一个拼写错误,因为这根本不正确。对不起,您是对的-这是一个大的拼写错误。每个控件的Render函数在main的PreRender之后调用,这就是为什么在PreRender期间调用它是安全的。谢谢你的提醒!