2013-11-25 21 views
1

根据MSDN,所述ScriptManager.RegisterStartupScript方法,(Page, Type, String, String, Boolean)过载,注册了一个脚本“使用ScriptManager控制异步回送并添加脚本块的页”。但是,这似乎并不是行为。相反,该脚本仅在执行一次后,在下一页或UpdatePanel呈现方法调用之后执行。它甚至不需要在异步回发中:常规回发或初始GET也会导致脚本执行。MSDN文档错误? ScriptManager.RegisterStartupScript不执行对每个异步回送

这必须是文档中的错误。你怎么看?运行下面的示例,并注意,在注册启动脚本后,将显示警报,但当单击另一个虚拟按钮以导致另一次回发时,警告不会显示,因为脚本未执行。但是,您可以再次单击注册按钮,警报将再次显示,表明行为不是由重复脚本键的某种抑制造成的。

<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<html> 
<head runat="server"> 
    <script type="text/javascript"> 
     function MyFunction() { alert("MyFunction"); } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:ScriptManager ID="ScriptManager" runat="server" /> 
     <asp:UpdatePanel ID="upTest" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <asp:Button ID="btnRegisterStartupScript" text="RegisterStartupScript" OnClick="btnRegisterStartupScript_Click" runat="server"/> 
      <asp:Button ID="btnDummyPostback" Text="Dummy Postback" runat="server" /> 
      <%=DateTime.Now%> 
     </ContentTemplate> 
     </asp:UpdatePanel> 
    </div> 
    </form> 
</body> 
</html> 
<script runat="server"> 
    protected void btnRegisterStartupScript_Click(object oSender, EventArgs e) { 
     ScriptManager.RegisterStartupScript(this, this.GetType(), "MyFunction", "MyFunction();", addScriptTags: true); 
    } 
</script> 

就个人而言,我不介意这种行为,因为需要有它允许开发人员只对当前异步回发运行脚本的方法。但我认为文档应该更准确。可以实现记录的行为,但只有在调用ScriptManager.RegisterStartupScript(this, this.GetType(), "MyFunction", "Sys.Application.add_load(function() { MyFunction(); });", addScriptTags: true);时才会使用客户端框架在匿名功能块内注册脚本。

+0

'使用ScriptManager控件为每个异步回发注册一个启动脚本块,并将该脚本块添加到页面中。每次单击RegisterStartupScript按钮时都会显示警报消息。 ***它完全符合所述的内容。你期望会发生什么?*** – Win

+0

@Win:如果它按照说明工作,我会看到每个异步回发的警报*。相反,当我通过虚拟按钮触发异步回发时,我看不到警报。 –

+0

通过虚拟按钮异步回发未向ScriptManager注册'MyFunction';这就是为什么'MyFunction'不再被调用。 **请记住,由于ASP.Net的无状态特性,“每个异步回传”都是独一无二的。**换句话说,它不保留以前的回发值。 – Win

回答

0

阅读文档此方法,RegisterStartupScript(Control, Type, String, String, Boolean)的其他重载之后,我想我找到了答案:“每一个异步回”的词意为对比这个超负荷的行为:

仅当注册块 的控件位于正在更新的UpdatePanel控件中时,使用此方法注册的启动脚本块才会发送到页面 。

换言之,只有在指定的控制是内一个UpdatePanel被更新的第一过载寄存器启动脚本,不管而第二过载寄存器启动脚本,每次它称为时间。不知何故,这引发了“每次异步回传”的措辞,这是不准确的。更好的方法是使用ScriptManager控件注册一个启动脚本块,并将该脚本块添加到页面中。当页面或UpdatePanel被渲染时,脚本块只执行一次。“

我已向Connect提交bug report,如果他们同意我的观点,我会将其标记为可接受的答案。

+0

Connect的第一级筛选器并不完全理解文档的问题,但他们没有关闭该错误,因此仍然希望能够更改文档:) –