舊版 Web Forms 把控制項狀態塞進隱藏欄位,所以重新整理與回傳之後,文字框裡的字還在。WebForms Core 的官方教學把「不使用 ViewState」列成優點。優點的背面是:你要自己決定哪些狀態活在 DOM、哪些活在伺服器、哪些活在瀏覽器歷史。

三種放法

不要找一個隱藏欄位把三邊都裝進去。WebForms Core 沒有那條自動通道。

DOM 適合「使用者正看著的東西」:錯誤訊息、剛加進清單的一列、按鈕是否停用。伺服器適合「重新整理之後仍必須為真的東西」:訂單已經成立、檔案已經寫入。歷史適合「這次點擊是頁面故事的一步」:精靈的下一步、可以退回的預覽。

用查詢字串推進歷史

下面的流程來自 Elanat 公開的 Razor Pages 狀態範例,收成你可以對照實作的步驟。重點不是 Razor 語法,是 Get 與 的搭配。

  1. 第一次 沒有動作查詢鍵。建立 ,對兩顆按鈕 ,路徑分別是 與 。把 放進 ,回傳 。

  2. 按鈕被按下後,同一個 看到查詢鍵,改呼叫對應的方法。

  3. 該方法 ,呼叫 寫入這一步的路徑與標題,再用 在頁面上留一句話。

  4. 回傳 ,不要回傳整頁。

的兩個參數是路徑與標題,編成 ,值為 。瀏覽器的上一頁會回到上一筆路徑。伺服器若在那條路徑上又依據查詢鍵重做一次指令,畫面才跟得上歷史;只在用戶端堆文字、伺服器不認得那條路徑,上一頁會打開一個沒有對應畫面的網址。

每一次點擊都是一次新的請求。伺服器預設不記得上一輪 物件裡有什麼,那個物件在 之後就可以丟掉。需要累積的清單,要嘛寫在頁面的 DOM(下一輪表單會把它送回來),要嘛寫在伺服器的儲存體。

快取是用戶端的捷徑

第 7 章的 、、、 是 WebFormsJS 的快取,不是 ASP.NET Core 的輸出快取。 的值是秒數, 表示永久。 只在這個瀏覽器工作階段有效。

它適合「同一段指令在短時間內會被要很多次」,例如多段回應裡那些離線組。它不適合當授權。永久快取一份會改 DOM 的指令,等於讓舊指令在你修完伺服器之後還繼續生效。公開說明建議多段回應搭配長期快取標頭時要有意識地開,而不是每一支 API 都開。

重新整理之後什麼還在

用歡迎頁做一次檢查,比記規則快。

@YY@ 操作 & 你應該觀察到
按下 Send & 表單變色、出現歡迎句、按鈕停用。網址可以不變。
重新整理 & 回到 View 原本的 HTML。歡迎句消失,按鈕恢復。伺服器沒有把這些寫進 ViewState。
按上一頁 & 若你沒呼叫 ,上一頁是進入這站之前的文件,不是「送出之前的那一幕」。送出之前的那一幕根本沒有被推進歷史。

若產品要求重新整理後歡迎句還在,就把姓名寫進資料庫或工作階段,並在沒有 標頭的第一次 用 把 夾進頁面。那是伺服器狀態,不是協定自動幫你留的。