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