ASP.NET 1.x 僅支援自我回傳,ASP.NET 2.0 引入 PostBackUrl 屬性與 @PreviousPageType 指令,實現真正的跨頁面回傳,並提供強型別存取前一頁面公開屬性,大幅簡化多頁面流程開發。
Button、LinkButton、ImageButton 設定 PostBackUrl="~/TargetPage.aspx"。@PreviousPageType VirtualPath="~/SourcePage.aspx",編譯器產生強型別 PreviousPage 屬性。public 屬性暴露控制項值,後頁面透過 PreviousPage.PropertyName 存取。<%@ 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>
<%@ 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>
IButtonControl 實作控制項:Button、LinkButton、ImageButton。~/)、絕對路徑、查詢字串(~/Page.aspx?param=value)。VirtualPath:前一頁面虛擬路徑(必須為 .aspx)。TypeName:替代方案,指定前一頁面編譯類別完整名稱(跨專案時使用)。PreviousPage 屬性型別為指定頁面類別,提供 IntelliSense。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
if (PreviousPage != null)
{
TextBox txt = (TextBox)PreviousPage.FindControl("txtName");
if (txt != null) Label1.Text = txt.Text;
}
缺點:需知道控制項 ID、型別轉換、無 IntelliSense、重構風險高。
CausesValidation="true" 且目標頁面有驗證群組對應。PreviousPage 存取控制項值(需啟用 ViewState)。@PreviousPageType 僅支援內容頁面,主版頁面需用 TypeName 指定內容頁面類別。| 方式 | URL 變更 | 伺服器端資料存取 | 適用場景 |
|---|---|---|---|
| 跨頁面回傳 | 是 | 強型別 PreviousPage 屬性 | 表單提交、多步驟精靈、搜尋結果頁 |
| Server.Transfer | 否 | Context.Handler 強轉 | 伺服器端流程控制、隱藏真實 URL |
| Response.Redirect | 是 | QueryString/Session | 導向外部、永久重導、書籤友善 |
跨頁面回傳是 ASP.NET 2.0 解決 Web Forms 多頁面流程資料傳遞的標準方案,配合強型別存取,讓開發體驗接近 Windows Forms。