你为什么不能UnRegisterStartupScript?(Why can't you U

2019-07-03 16:00发布

在我看来,这是一个有点怪异,你可以做..

Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);

再后来就不能注销或者被编程呈现停止的JavaScript。

为什么微软这样做呢?

我不喜欢的工作在这里.. http://hemant-vikram.blogspot.com/2005/11/unregister-startup-script-workaround.html

而且我不喜欢的只是重新注册它,并让它做什么选择..

思考?

Answer 1:

我假设你想要某种条件下为“注销”的脚本(已注册),就像这样:

Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);
...
if(condition)
    Page.ClientScript.UnregisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);

为什么不能这只是改为:

if(!condition)
    Page.ClientScript.RegisterStartupScript(this.GetType(), "KeyName", "alert('changed my mind')", true);


Answer 2:

它实际上不如你认为 - “只需重新注册它,并让它什么都不做”是不是一种选择或者。 register方法检查,如果脚本已经使用该密钥注册,和什么也不做,如果它是。 一旦你调用RegisterStartupScript ,什么可以做,将停止正在呈现该脚本。

至于为什么微软这样做,我猜想,当改变或取消注册脚本的可能性被置之脑后RegisterStartupScript最初设计。 该设计选择发生,使其不平凡回去,并创建一个注销的方法,因此他们现在会需要一个很好的理由这样做。

当您注册一个脚本,它存储在ClientScriptManager中的两个位置。 一个ListDictionary允许检查脚本是否已经被注册,以及一个ArrayList存储实际的脚本,它们将被渲染。 我假设的ArrayList是用来确保脚本在其注册的顺序呈现,但它也意味着你不能告诉串ArrayList中属于哪个键。

它不会是太难与方法来装备自己的网页类MaybeAddStartupScript(key,script)ChangedMyMindAboutThatStartupScript(key) 。 存储密钥和脚本在自己的字典,然后在PreRender,注册为准脚本了这么远。 这当然是恼人不得不自己做,虽然。



Answer 3:

很多研究之后,我发现了一个解决问题的办法,如果你想只运行一次基于事件的注册脚本 。 特别感谢@ stevemegson的答案在这里,让我明白了什么问题实际上是。

该解决方案包括了Sys.Application.add_loadremove_load JavaScript方法。

它的工作原理是这样的。 一个普通的JavaScript函数,首先调用工人功能,然后删除本身就是第一条语句,然后add_load遵循它通过调用该函数:

protected void Button1_Click(object sender, EventArgs e)
{
    var script = @"<script language='javascript'>
                       function f(){ MyWorkerFunction(); 
                                     Sys.Application.remove_load(f);}; 
                       Sys.Application.add_load(f);
               </script>";

    ClientScript.RegisterStartupScript(GetType(), 
                                   "MyWorkerFunctionKey", 
                                    script, 
                                    false);
}

这是基于一个Telerik的解决方案 。 它引用Telerik控制,但所有的功能是ASP.NET。



Answer 4:

如何覆盖加(动态)由Asp.Net的UpdatePanel一个JavaScript函数?

我认为,一个使用的UpdatePanel是解决覆盖JS之一。 当我们使用更新面板中的JavaScript没有偏后跑回来,必须通过代码进行注册:

    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_endRequest(someFunciton);

如果我们不这样我们就可以注册/再偏后期渲染修改的功能早在更新面板。 在这种情况下,有一些问题的功能范围。

对不起我的英语不好。



文章来源: Why can't you UnRegisterStartupScript?