1

如果我在第一页加载时添加客户端脚本块,如下所示:

   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)));
                }
            }

我是否需要在所有回发邮件中重新注册?

谢谢,

4

2 回答 2

2

如果脚本所在页面的实际部分在回发后重新呈现,那么是的。如果没有,那么就没有,事实上,你不能这样做,否则它可能会被复制。

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

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

于 2011-03-08T15:40:55.617 回答
0

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

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

于 2011-03-08T15:25:56.650 回答