2013-11-25 16 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的第一級篩選器並不完全理解文檔的問題,但他們沒有關閉該錯誤,因此仍然希望能夠更改文檔:) –