你为什么不能UnRegisterStartupScript?

对我来说,你可以做到有点奇怪..

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

然后,您无法取消注册或停止以编程方式呈现javascript。

为什么微软会这样做?

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

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

思考?

我假设您想要在某些条件下“取消注册”脚本(已经注册),如下所示:

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

它实际上比你想象的还要糟糕 – “只是重新注册并让它无所事事”也不是一种选择。 register方法检查脚本是否已经使用该键注册,如果是,则不执行任何操作。 一旦调用RegisterStartupScript ,您无法执行任何操作将停止呈现该脚本。

至于为什么微软这样做,我猜想在首次设计RegisterStartupScript ,忘记更改或删除已注册脚本的可能性。 设计选择恰好使得返回并创建取消注册方法变得非常简单,因此他们现在需要有充分的理由去做。

注册脚本时,它存储在ClientScriptManager中的两个位置。 ListDictionary允许检查脚本是否已经注册,并且ArrayList存储将呈现的实际脚本。 我假设ArrayList用于确保脚本按照它们的注册顺序呈现,但这也意味着您无法分辨ArrayList中的哪个字符串属于哪个键。

使用MaybeAddStartupScript(key,script)ChangedMyMindAboutThatStartupScript(key)方法为自己的页面类配置起来并不是非常困难。 将密钥和脚本存储在您自己的字典中,然后在PreRender中,注册到目前为止的任何脚本。 但是,必须自己做这件事当然很烦人。

经过深入研究,如果您只想根据事件运行一次注册脚本 ,我找到了问题的解决方案。 特别感谢@ stevemegson的回答,帮助我了解问题究竟是什么。

该解决方案涉及Sys.Application.add_loadremove_load javascript方法。

它的工作原理如下。 首先调用worker函数,然后删除自身的通用javascript函数是第一个语句,然后add_load通过调用该函数add_load它:

 protected void Button1_Click(object sender, EventArgs e) { var script = @""; ClientScript.RegisterStartupScript(GetType(), "MyWorkerFunctionKey", script, false); } 

这是基于telerik解决方案 。 它引用了telerik控件,但所有function都是ASP.NET。

如何覆盖Asp.Net UpdatePanel添加的(动态)Javascript函数?

我认为使用updatepanel是覆盖js的解决方案之一。 当我们使用更新面板时,JavaScript不会在部分回发上运行,必须通过代码注册:

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

如果我们不这样做,那么我们可以在更新面板中的部分回发上再次注册/渲染修改后的函数。 在这种情况下,function范围存在一些问题。

对不起我的英语不好。