9

在我看来,你能做的有点奇怪..

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

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

微软为什么要这样做?

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

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

想法?

4

4 回答 4

10

它实际上比你想象的更糟糕 - “只是重新注册它并且让它什么都不做”也不是一种选择。register 方法检查脚本是否已经使用该键注册,如果是,则不执行任何操作。一旦您调用RegisterStartupScript,您将无法阻止该脚本的渲染。

至于微软为什么这样做,我猜想更改或删除注册脚本的可能性在RegisterStartupScript最初设计时就被遗忘了。设计选择恰好使返回并创建注销方法变得不简单,因此他们现在需要一个充分的理由来这样做。

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

MaybeAddStartupScript(key,script)为您自己的页面类配备和的方法并不难ChangedMyMindAboutThatStartupScript(key)。将键和脚本存储在您自己的字典中,然后在 PreRender 中,注册到目前为止的任何脚本。不过,必须自己做肯定很烦人。

于 2009-08-25T15:26:44.973 回答
5

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

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);
于 2009-08-25T14:20:39.673 回答
2

经过大量研究,如果您只想基于事件运行一次注册脚本,我找到了解决问题的方法。特别感谢@stevemegson 在这里的回答,它帮助我理解了问题的实质。

解决方案涉及Sys.Application.add_loadremove_loadjavascript 方法。

它是这样工作的。第一个语句是一个通用的 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。

于 2014-04-09T17:58:30.907 回答
0

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

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

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

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

对不起我的英语不好。

于 2017-11-15T07:31:16.737 回答