在 ASP.NET Web Forms 開發中,經常需要在伺服器端程式碼(後台)觸發客戶端的 JavaScript 函式。例如:資料儲存成功後彈出提示、按鈕點擊後開啟新視窗、或是動態註冊腳本邏輯。本文整理三種主流做法,並說明各自的適用場景與注意事項。
最直觀的方式是在後台透過 Response.Write 將 <script> 標籤直接寫入 HTTP 回應串流中。
Response.Write("<script type='text/javascript'>alert('XXX');</script>");
Response.Write 中把函式定義也一併寫出來:Response.Write("<script type='text/javascript'>function myfun(){ ... }</script>");
ClientScript.RegisterStartupScript 是官方推薦的方式,它會在頁面載入完成(onload 階段)自動執行註冊的腳本,且能正確處理腳本載入順序。
// 確認 MyFun 已在頁面或引用的 .js 檔中定義
ClientScript.RegisterStartupScript(
this.GetType(),
"myscript",
"<script>MyFun();</script>",
false // 若最後一個參數為 true,框架會自動加上 script 標籤
);
key 的腳本只會輸出一次。針對具體控制項(如 Button、LinkButton),可在伺服器端動態添加 onclick 等屬性。
Button1.Attributes.Add("onclick", "MyFun();");
Page_Load 或更早的初始化階段(OnInit、OnPreRender)加入才會生效。Button_Click)之前執行,無法改變執行順序。Response.Redirect、Server.Transfer 等導向語句,瀏覽器可能不會執行已註冊的腳本。解決辦法是將導向邏輯移至 JavaScript(如 window.location.href)。| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| Response.Write | 簡單測試、輸出內嵌函式定義 | 直觀、無需額外 API | 時機難控制、無法呼叫外部自訂函式 |
| ClientScript.RegisterStartupScript | 大多數「頁面載入後執行」需求 | 標準、支援外部函式、自動去重 | 僅限 Web Forms、非 UpdatePanel 異步回發 |
| Control.Attributes.Add | 特定控制項的點擊、滑鼠事件 | 精確綁定到單一元素 | 執行順序固定、不支援異步回發 |
ClientScript.RegisterStartupScript 或 ScriptManager.RegisterStartupScript(含 UpdatePanel 時)。ScriptManager.RegisterStartupScript。window.location.href = '...' 而非使用 Response.Redirect。