首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# WebForms:正確返回上一頁的 JavaScript 技巧

     編輯:關於C語言

問題背景

在 ASP.NET WebForms 中,按鈕點擊觸發 PostBack 後,頁面實際上已「重新整理」一次。若在伺服器端註冊 history.go(-1),瀏覽器歷史記錄會包含 PostBack 後的頁面,導致返回上一頁實際返回「PostBack 前的同一頁」,使用者感覺無反應。需用 history.go(-2) 跳過 PostBack 頁面。

伺服器端註冊腳本

// 方式 1:ClientScriptManager(建議)
ClientScript.RegisterStartupScript(GetType(), "BackScript", "history.go(-2);", true);

// 方式 2:ScriptManager(AJAX 環境)
ScriptManager.RegisterStartupScript(this, GetType(), "BackScript", "history.go(-2);", true);

// 方式 3:Response.Write(不建議,易破壞頁面結構)
Response.Write("");

為什麼是 -2?

  1. 使用者在頁面 A 點擊連結進入頁面 B。
  2. 頁面 B 點擊按鈕 → PostBack → 頁面 B 重新載入(歷史記錄新增一筆)。
  3. 此時歷史堆疊:[A, B(PostBack前), B(PostBack後)]。
  4. history.go(-1) 返回 B(PostBack前) → 畫面看似未變。
  5. history.go(-2) 直接返回 A。

前端替代方案

若不想依賴歷史記錄計算,可在按鈕 OnClientClick 直接呼叫:


或使用 window.location.href = document.referrer;(需注意 referrer 可能為空)。

注意事項

  • history.go 依賴瀏覽器歷史堆疊,若使用者透過書籤、直接輸入網址進入,返回行為不可預期。
  • 現代 SPA / Blazor / Razor Pages 應使用路由導航而非 history 操作。
  • 若頁面包含 UpdatePanel(部分更新),歷史記錄不會新增,仍用 -1 即可。

結語

WebForms PostBack 機制導致歷史記錄多一筆,返回上一頁需用 history.go(-2)。建議改用 ClientScript.RegisterStartupScript 註冊腳本,並評估是否適合改用前端導航或現代框架路由。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved