根據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);
時纔會使用客戶端框架在匿名功能塊內註冊腳本。
'使用ScriptManager控件爲每個異步回發註冊一個啓動腳本塊,並將該腳本塊添加到頁面中。每次單擊RegisterStartupScript按鈕時都會顯示警報消息。 ***它完全符合所述的內容。你期望會發生什麼?*** – Win
@Win:如果它按照說明工作,我會看到每個異步回發的警報*。相反,當我通過虛擬按鈕觸發異步回發時,我看不到警報。 –
通過虛擬按鈕異步回發未向ScriptManager註冊'MyFunction';這就是爲什麼'MyFunction'不再被調用。 **請記住,由於ASP.Net的無狀態特性,「每個異步回傳」都是獨一無二的。**換句話說,它不保留以前的回發值。 – Win