IsPostBack 是 Page 判斷「是否為首次請求」的核心屬性。本文從 .NET Framework 原始碼出發,推導出八大判斷結論,並逐行分析邏輯分支,釐清 Server.Transfer、Response.Redirect、跨頁回傳、Server.Execute、頁面重新編譯等特殊情境下的行為差異。
Server.Transfer 遷移目標頁:IsPostBack = false。Request.Form == null,或 GET 但 Request.QueryString == null:false。__VIEWSTATE、__EVENTTARGET、__VIEWSTATEFIELDCOUNT 等關鍵鍵/值:false。Response.Redirect 自我導向:false(含 __redir=1 標記)。PreviousPage 時:true。false。Server.Execute 遷移目標頁:false。false。public bool IsPostBack
{
get
{
if (this._requestValueCollection == null) return false;
if (this._isCrossPagePostBack) return true;
if (this._pageFlags[8]) return false;
return ( (this.Context.ServerExecuteDepth <= 0) ||
((this.Context.Handler != null) && (base.GetType() == this.Context.Handler.GetType())) )
&& !this._fPageLayoutChanged;
}
}
對應 DeterminePostBackMode() 回傳 null 的五種情況:
Context.Request == null:異常情況。Context.PreventPostback == true:Server.Transfer 內部設定 → 結論①。GetCollectionBasedOnMethod() 回傳 null:POST 無 Form / GET 無 QueryString → 結論②。__VIEWSTATE 等)且無特殊無鍵值 → 結論③。__redir=1:Response.Redirect 自我導向標記 → 結論④。在 PreviousPage 屬性 getter 中,對源頁面設定 _isCrossPagePostBack = true → 結論⑤。
在 ProcessRequestMain 中,跨頁回傳目標頁解密 __PREVIOUSPAGE 失敗或路徑不匹配時設為 true → 結論⑥。
Server.Execute 會遞增 ServerExecuteDepth 且 Context.Handler 仍為源頁面類型 → 條件為 false → 結論⑦。
LoadAllState 中比對 ViewState 存儲的 TypeHashCode 與當前 GetTypeHashCode()。頁面元素變化導致編譯產生新 Hash → true → 結論⑧。
Request.Form["__VIEWSTATE"] 存在即視為 PostBack。IsPostBack 看似簡單,實則包含請求集合分析、跨頁導向標記、執行緒深度檢查、頁面版本指紋比對等多重邏輯。深度理解其判斷鏈路,是 ASP.NET 進階開發與疑難排解的必修課。