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

ASP.NET 頁面導航返回保持原頁狀態:Server.Transfer、PreviousPage 與 HttpContext.Handler 實戰

     編輯:關於ASP.NET

傳統 Response.Redirect 或 `history.back()` 導致查詢條件、捲軸位置、分頁狀態遺失。本文比較四種保持狀態回傳方案:Server.Transfer + PreviousPage、HttpContext.Current.Handler 型別轉換、Session/ViewState、URL 參數,並給出實作代碼與優缺點分析。

方案比較

方案原理優點缺點
Server.Transfer + PreviousPage伺服器端轉移,保留前一頁物件實例無網路往返、直接存取前頁控制項/屬性URL 不變、瀏覽器歷史無記錄、需啟用 EnableViewStateMac
HttpContext.Current.Handler當前處理常式即前一頁實例不需 Transfer,適用 Redirect 後回傳型別轉換需知前頁具體類型、跨應用程式失效
Session/ViewState伺服器/客戶端儲存狀態通用、支援跨頁面Session 消耗記憶體、ViewState 增加頻寬
URL 參數 (QueryString)狀態序列化為 URL可書籤、可分享、無伺服器狀態長度限制、敏感資料洩漏、需手動編碼/解碼

方案一:Server.Transfer + PreviousPage (推薦)


// Search.aspx 查詢頁
public partial class Search : Page
{
    public string SqlWhere { get; set; } // 供結果頁讀取

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        SqlWhere = BuildWhereClause(); // 組裝查詢條件
        Server.Transfer("Result.aspx"); // 伺服器端轉移
    }
}

// Result.aspx 結果頁
public partial class Result : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack && PreviousPage is Search search)
        {
            string sql = search.SqlWhere;
            LoadGrid(sql); // 直接使用前頁屬性查詢
        }
    }

    protected void btnBack_Click(object sender, EventArgs e)
    {
        Server.Transfer("Search.aspx"); // 返回查詢頁,狀態完整保留
    }
}

方案二:HttpContext.Current.Handler (跨 Redirect 可用)


// Search.aspx
public partial class Search : Page
{
    public string DateTimeValue { get; set; }
    protected void btnGo_Click(object sender, EventArgs e)
    {
        DateTimeValue = txtDate.Text;
        Response.Redirect("Detail.aspx"); // 真正 Redirect
    }
}

// Detail.aspx
public partial class Detail : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack && HttpContext.Current.Handler is Search search)
        {
            hiddenField.Value = search.DateTimeValue; // 取得前頁屬性
        }
    }
    protected void btnBack_Click(object sender, EventArgs e)
    {
        Response.Redirect("Search.aspx"); // 回傳,但 Search 會重新初始化
    }
}

方案三:HiddenField + PreviousPage 找控制項 (MasterPage 相容)


if (PreviousPage != null)
{
    var cp = (ContentPlaceHolder)PreviousPage.Master.FindControl("UIContentAreaPlaceHolder");
    if (cp != null)
    {
        var hf = (HiddenField)cp.FindControl("hfSql");
        if (hf != null) this.hfSql.Value = hf.Value;
    }
}
LoadGrid(this.hfSql.Value);

最佳實務建議

  1. 單純查詢→結果→返回:Server.Transfer + PreviousPage 最簡潔高效。
  2. 需瀏覽器歷史記錄/書籤:QueryString 序列化查詢條件 (注意長度與敏感資料)。
  3. 跨多頁面流程 (精靈):Session 儲存流程狀態物件,步驟間讀寫。
  4. 避免大量資料存 ViewState,導致頁面膨脹。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved