我是否必须在回发后重新注册客户端脚本?

时间:2011-03-08 15:18:56

标签: javascript asp.net postback registerclientscriptblock

如果我在第一页上添加客户端脚本块,请加载:

   if (this.Page.IsPostBack==false)
            {
                if (this.Page.ClientScript
                          .IsClientScriptIncludeRegistered("ctlmyControl")==false)
                {
                    string guidParamToHackBrowserCaching 
                                  = System.Guid.NewGuid().ToString();

this.Page.ClientScript.RegisterClientScriptInclude("ctlmyControl"
                         , ResolveUrl(String
                          .Format("~/clientScripts/ctlmyControl.js
                        ?par={0}",guidParamToHackBrowserCaching)));
                }
            }

我是否需要在所有回复中重新注册

谢谢,

2 个答案:

答案 0 :(得分:2)

如果在回发后重新呈现脚本所在页面的实际部分,则为是。如果没有,那么不,事实上,你一定不能或者它可以重复。

更具体地说,如果您正在使用使用部分回发的页面,并且呈现UpdatePanel需要注册脚本的代码,则不应重新注册它,除非在第一页加载。另一方面,如果页面加载完整回发或初始页面加载,那么必须注册它。 ScriptManager将在UpdatePanel的动态内容区域之外插入部分回发的脚本,但它不会考虑可能在之前的回发中呈现的现有脚本。 (这有意义吗?不是真的。但确实如此。)

如果脚本没有以任何方式持久存在,那就是长短,除非它们仍然存在于客户端,因为页面的这一部分没有被重新加载。并且ScriptManager没有做任何努力来记住已经在页面的静态部分中呈现的内容。因此,如果脚本将呈现的实际位置将在回发上更新(无论是异步还是完整),那么您需要重新注册脚本,否则不需要。

答案 1 :(得分:0)

这取决于脚本的用途,但可能。当您回发时,浏览器中的旧DOM(包括任何脚本)将被销毁,您还将使用新的页面实例。如果您仍然需要将其作为页面的一部分,那么您需要确保它仍然已注册。

另一种方法是将脚本重构为更静态,这样您需要的控件值就是将参数传递给函数。然后你可以使用一个普通的<script标签,你需要对每个回发做的唯一事情是将控件的id写入一个你可以在调用函数时使用的变量。