2011-03-08 58 views
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))); 
       } 
      } 

我需要所有后背上,重新注册呢?

谢谢,

回答

2

如果脚本所在页面的实际部分在回发后重新呈现,那么是的。如果不是,那么不,事实上,你不可以或它可以被复制。

更具体地说,如果您使用的是页面使用部分回发,并呈现UpdatePanel需要注册脚本代码,那么你不应重新注册它除了在第一页的负荷。另一方面,如果页面在完全回传或初始页面加载时加载,那么您必须注册它。 ScriptManager将在部分回发中在UpdatePanel的动态内容区域外插入脚本,但它不会考虑在先前回发中可能已经呈现的现有脚本。 (这是否有道理?不是真的,但它是这样的。)

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

0

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

另一种方法是重构脚本使其更加静态,这样您需要的控件值就是传递给函数的参数。然后,您可以使用正常的<script标记,并且每次回发中唯一需要执行的操作是将控件的标识写入可在调用该函数时使用的变量。

+0

如果它是一个异步调用服务器部分回发 - 我认为脚本停留在browwser缓存。正确? – pencilCake 2011-03-08 15:34:02

+1

@burak - 是的,对于部分回发,浏览器中的DOM不会被销毁,所以脚本仍然存在于客户端。 – 2011-03-08 15:48:58

+0

..除非脚本实际呈现在更新的页面部分。我非常肯定,如果你使用'RegisterStartupScript',它将在'UpdatePanel'区域,如果不是,它不会。所以你会想在部分回发后重新注册一个启动脚本(实际上这就是区别,因为这样的脚本实际上会在部分回发之后运行)。 – 2011-03-08 15:51:42

相关问题