当是绝对的最新的你可以叫页。ClientScript.RegisterClientScriptBlock?
-
05-07-2019 - |
题
我需要输出一些JavaScript在件网络控件基于一些处理和某些属性,消费者可能设定,这样做对负荷的网页将以早。
当时是最新的,我可以叫RegisterClientScriptBlock且还有它输出的页面?
解决方案
的OnPreRender
或者,如果在调用“base.Render”之前覆盖了Render ....
其他提示
老问题,但我最近处理了这个,所以得到蒂姆的回答多一点的澄清和明确的起点错误的信息:
如果你使用RegisterClientScriptBlock像你要求,然后你的脚本会期间的输出ClientScriptManager.RenderClientScriptBlocks,这就是所谓的过页。BeginFormRender--但它实际上是所谓的形式,而不是由页。
这是序列:
- 页。ProcessRequestMain(当达到呈现段)的电话
- (网页的基类)的控制。RenderControl其中要求
- 控制。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();
}
}
注意到呼吁页。BeginFormRender和网页。EndFormRender.它们之间的形式,呼吁它的基地。RenderChildren这将最终呼吁所呈现的方法在您的定义的用户控制。所以是真实的你的原始的问题,不能交互的ClientScriptBlocks部分的脚本中的任何时间的任何儿童的控制是呈现顺序,因为他们已经被输出到响应流。你的 可以 添加脚本到这块在呈现的顺序如果是在该页的呈现方法之前你打电话的基础。呈现,因为蒂姆提到,但这并不是工作在儿童控制的任何一种。
如果呈现的顺序是所有你需要的工作(这种情况,我在)然后可以使用ClientScript.RegisterStartupScript在你的控制的呈现,如RenderClientStartupScripts被称为过页。EndFormRender,这种情况发生 后 你的控制是告诉呈现,你可以看到,在代码以上。
逻辑上,您的启动脚本需要在页面上进行渲染以及注册,因此Page_PreRender事件似乎是一个不错的选择。之后,页面的HTML和脚本被“锁定”。
即使在主页面上,您也可以在PreRender期间调用它。每个控件的渲染功能都在主页面的PreRender之后调用,因此渲染功能将是一个安全的地方。