在我看来,这是一个有点怪异,你可以做..
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_load
和remove_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。
如何覆盖加(动态)由Asp.Net的UpdatePanel一个JavaScript函数?
我认为,一个使用的UpdatePanel是解决覆盖JS之一。 当我们使用更新面板中的JavaScript没有偏后跑回来,必须通过代码进行注册:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(someFunciton);
如果我们不这样我们就可以注册/再偏后期渲染修改的功能早在更新面板。 在这种情况下,有一些问题的功能范围。
对不起我的英语不好。