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

ASP.NET 2.0 跨頁面回傳完整指南:PostBackUrl、PreviousPageType、新視窗目標與強型別存取前頁資料

     編輯:關於ASP.NET

ASP.NET 1.x 僅支援自我回傳,ASP.NET 2.0 引入 PostBackUrl 屬性與 @PreviousPageType 指令,實現真正的跨頁面回傳,並提供強型別存取前一頁面公開屬性,大幅簡化多頁面流程開發。

核心機制

  • 來源頁面:Button、LinkButton、ImageButton 設定 PostBackUrl="~/TargetPage.aspx"。
  • 目標頁面:頁面指令 @PreviousPageType VirtualPath="~/SourcePage.aspx",編譯器產生強型別 PreviousPage 屬性。
  • 資料傳遞:前頁面定義 public 屬性暴露控制項值,後頁面透過 PreviousPage.PropertyName 存取。

完整範例:兩頁面資料傳遞

FirstPage.aspx(來源)

<%@ Page Language="C#" %>
<script runat="server">
    // 公開屬性暴露文字方塊值
    public string UserName 
    { 
        get { return txtName.Text; } 
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        // 自我回傳示範
        Label1.Text = "自我回傳。您的名字:" + txtName.Text;
    }
</script>
<html><body><form id="form1" runat="server">
  <h3>第一頁</h3>
  您的名字:<asp:TextBox ID="txtName" runat="server" /><br />
  <asp:Label ID="Label1" runat="server" EnableViewState="False" /><br /><br />
  <asp:Button ID="Button1" runat="server" Text="自我回傳" OnClick="Button1_Click" /><br /><br />
  <asp:Button ID="Button2" runat="server" Text="跨頁回傳到第二頁" PostBackUrl="~/SecondPage.aspx" />
</form></body></html>

SecondPage.aspx(目標)

<%@ Page Language="C#" %>
<%@ PreviousPageType VirtualPath="~/FirstPage.aspx" %>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
        {
            Label1.Text = "您的名字是:" + PreviousPage.UserName;
        }
        else
        {
            Label1.Text = "非跨頁面回傳進入。";
        }
    }
</script>
<html><body><form id="form1" runat="server">
  <h1>這是第二頁</h1>
  <p><asp:Label ID="Label1" runat="server"></asp:Label></p>
</form></body></html>

關鍵技術細節

PostBackUrl 屬性

  • 適用於 IButtonControl 實作控制項:Button、LinkButton、ImageButton。
  • 支援相對路徑(~/)、絕對路徑、查詢字串(~/Page.aspx?param=value)。
  • 回傳時瀏覽器 URL 變更為目標頁面,歷史記錄記錄目標頁面。

@PreviousPageType 指令

  • VirtualPath:前一頁面虛擬路徑(必須為 .aspx)。
  • TypeName:替代方案,指定前一頁面編譯類別完整名稱(跨專案時使用)。
  • 編譯器產生 PreviousPage 屬性型別為指定頁面類別,提供 IntelliSense。

IsCrossPagePostBack 屬性

Page.IsCrossPagePostBack 判斷目前回傳是否來自跨頁面回傳,避免直接瀏覽目標頁面時 PreviousPage 為 null 導致例外。

新視窗開啟目標頁面

修改來源頁面 <form> 標籤 target 屬性:

<form id="form1" runat="server" target="_blank">

或針對特定按鈕(需 JavaScript 輔助):

<asp:Button ID="Button2" runat="server" Text="新視窗跨頁" PostBackUrl="~/SecondPage.aspx" 
    OnClientClick="this.form.target='_blank';" />

進階:無 PreviousPageType 的弱型別存取

// 目標頁面未宣告 @PreviousPageType
if (PreviousPage != null)
{
    TextBox txt = (TextBox)PreviousPage.FindControl("txtName");
    if (txt != null) Label1.Text = txt.Text;
}

缺點:需知道控制項 ID、型別轉換、無 IntelliSense、重構風險高。

常見陷阱與最佳實務

  • 驗證控制項:跨頁回傳預設不觸發目標頁面驗證,來源頁面需設定 CausesValidation="true" 且目標頁面有驗證群組對應。
  • ViewState:前頁面 ViewState 不自動傳遞,需自行儲存於 Session/資料庫或使用 PreviousPage 存取控制項值(需啟用 ViewState)。
  • 巡覽歷史:使用者按「上一頁」回到來源頁面,表單狀態可能遺失,建議重要流程使用 Wizard 控制項或 Session 狀態機。
  • 主版頁面:@PreviousPageType 僅支援內容頁面,主版頁面需用 TypeName 指定內容頁面類別。

與 Server.Transfer/Response.Redirect 比較

方式URL 變更伺服器端資料存取適用場景
跨頁面回傳是強型別 PreviousPage 屬性表單提交、多步驟精靈、搜尋結果頁
Server.Transfer否Context.Handler 強轉伺服器端流程控制、隱藏真實 URL
Response.Redirect是QueryString/Session導向外部、永久重導、書籤友善

跨頁面回傳是 ASP.NET 2.0 解決 Web Forms 多頁面流程資料傳遞的標準方案,配合強型別存取,讓開發體驗接近 Windows Forms。

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