共用方式為


在 ASP.NET Web 網頁中跨網頁公佈

更新:2007 年 11 月

根據預設,在 ASP.NET Web 網頁上會造成回傳的按鈕和其他控制項,會將網頁送回給自己。這是 ASP.NET Web 網頁在正常處理時會經歷的過程,屬於來回週期的一部分。如需詳細資訊,請參閱 ASP.NET Web 網頁簡介

在某些情況下,您可能想要將網頁張貼至其他網頁。例如,您可能建立在每個網頁上收集不同資訊的多重網頁表單。在這種情況下,您可以在網頁上設定某些控制項 (實作 IButtonControl 介面的控制項,例如 Button 控制項),以便張貼至不同的目標網頁。這稱為跨網頁公佈。跨網頁公佈比使用 Transfer 方法重新導向至其他網頁多了某些優點。如需詳細資訊,請參閱將使用者重新導向至另一網頁

注意事項:

您也可以使用 Wizard 控制項建立多重檢視表單。如需詳細資訊,請參閱 Wizard Web 伺服器控制項概觀

因為跨網頁公佈是針對個別控制項設定,所以您可以依照使用者按下的按鈕而定,建立張貼至不同網頁的網頁。

從來源網頁取得資訊

當您設定跨網頁公佈的網頁時,會經常想要從來源網頁取得資訊。這可能包含來自網頁上控制項的資訊 (也就是瀏覽器張貼的資訊) 以及來源網頁的公用屬性。

取得控制項值

Page 類別會公開名為 PreviousPage 的屬性。如果來源網頁和目標網頁在相同的 ASP.NET 應用程式中,目標網頁的 PreviousPage 屬性會包含來源網頁的參考 (如果網頁不是跨網頁公佈的目標,或是網頁在不同的應用程式中,就不會初始化 PreviousPage 屬性)。根據預設,PreviousPage 屬性的型別是 Page

注意事項:

如果來源網頁和目標網頁在不同的應用程式中,您就無法直接取得網頁上控制項的值,但是可以從 Form 字典中讀取張貼的資料。您無法從來源網頁讀取檢視狀態 (因為已經雜湊)。如果您想要在來源網頁中儲存值,並且在其他應用程式的目標網頁中使用,可以用字串形式將值儲存在來源網頁的隱藏欄位中,然後經由目標網頁上的 Request.Form 進行存取。

您可以使用 PreviousPage 屬性中的參考,搜尋來源網頁上的控制項並擷取值。通常會使用 FindControl 方法執行這項動作。

注意事項:

如果您特別編碼來源網頁以便能夠與目標網頁共用資訊,有一個比較簡單的方法可以讓目標網頁使用控制項的值,就是將這些值公開成公用屬性。如需詳細資訊,請參閱本主題稍候的從來源網頁取得公用屬性值。

下列程式碼範例,示範了如何取得來源網頁上 TextBox1 控制項的值。

If Not Page.PreviousPage Is Nothing Then
    Dim SourceTextBox As TextBox
    SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
        TextBox)
    If Not SourceTextBox Is Nothing Then
        Label1.Text = SourceTextBox.Text
    End If
End If
if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

FindControl 方法會尋找目前命名容器中的控制項。如果您尋找的控制項在其他控制項中 (通常是在範本中),您必須先取得容器的參考,然後搜尋容器以便尋找想要取得的控制項。在下列程式碼範例中,來源網頁包含使用 LayoutTemplate 容器的 Login 控制項,而這個容器包含名為 UserName 的 TextBox 控制項。程式碼會取得 UserName 控制項的值。

Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

從來源網頁取得公用屬性值

在跨網頁公佈的目標網頁中,您也可以取得來源網頁公用成員的值。最常見的案例是來源網頁定義公用屬性,而您想要在目標網頁上取得它們的值。

安全性注意事項:

建議您只公開做為公用屬性所需要的資訊,以減少潛在惡意使用者能夠使用的資訊量。

若要取得來源網頁的公用成員,您必須先取得來源網頁的強型別參考。

有數種方式可以執行這個動作。首先是在目標網頁中包含 @ PreviousPageType 指示詞,可以讓您指定來源網頁,如同下列程式碼範例所示:

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 

當包含這個指示詞時,PreviousPage 屬性會強型別為參考來源網頁的類別。所以,您可以直接參考來源網頁的公用成員。您可以使用 type 屬性直接指定來源網頁的類型,或是藉由明確參考 VirtualPath 屬性中的來源網頁間接指定,如同程式碼範例所示。

下列程式碼範例示範了一部分來源網頁,其中包含名為 CurrentCity 的公用屬性,其會公開名為 textCity 的 TextBox 控制項的值。

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
注意事項:

在來源網頁上的屬性,如果主要是為了公開跨網頁張貼的值而建立,則通常是唯讀屬性。雖然來源網頁能夠包含公用讀取/寫入屬性,但是從目標網頁屬性設定來源網頁屬性通常沒有特別用意,因為並不會保存值。

如果目標網頁包含指向來源網頁的 PreviousPageType 指示詞,您可以使用像是下列的程式碼存取來源網頁的 CurrentCity 屬性。

Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

另一個取得來源網頁強型別參考的方法,是在參考來源網頁的目標網頁中包含 @ Reference 指示詞,如同參考想要在網頁中使用的任何型別一樣。在這種情況下,在目標網頁中您可以取得目標網頁的 PreviousPage 屬性,並將其轉換為來源網頁類型,如同下列程式碼範例所示。

Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

在目標網頁中檢查回傳

在跨網頁回傳期間,來源網頁的控制項內容會張貼至目標網頁,並且瀏覽器會執行 HTTP POST 作業 (不是 GET 作業)。然而在目標網頁中,在跨網頁公佈後 IsPostBack 屬性就會立即是 false。雖然這是 POST 的行為,但是跨公佈並非回傳至目標網頁。因此,IsPostBack 會設定為 false,並且目標網頁就會經歷首次程式碼。

如果在應用程式中很有用的話,您可以判斷目標網頁是否執行為跨網頁公佈的結果。若要執行這項動作,您可以測試目標網頁之 PreviousPage 屬性傳回的網頁參考 IsCrossPagePostBack 屬性,如同下列程式碼範例所示。

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

請注意,如果目前的網頁不是跨網頁公佈的目標,PreviousPage 屬性會傳回 null (在 Visual Basic 中為 Nothing)。

如需詳細資訊,請參閱 HOW TO:判斷 ASP.NET Web 網頁的叫用方式

跨網頁公佈或 Server.Transfer

PreviousPage 屬性和 PreviousPageType 指示詞在兩種叫用目標網頁的情形下很有用:在跨網頁回傳 (以用戶端為主的傳輸) 和 Transfer 方法 (伺服器端作業)。在兩種作業中,目標網頁中的程式碼可以使用 PreviousPage 屬性取得來源網頁的參考。

在目標網頁中判斷是否從跨網頁公佈或 Server.Transfer 作業叫用網頁是很重要的。為了協助您執行這項動作,Page 類別會公開名為 IsCrossPagePostBack 的屬性。如需詳細資訊,請參閱 HOW TO:判斷 ASP.NET Web 網頁的叫用方式

請參閱

工作

HOW TO:將 ASP.NET Web 網頁張貼至不同的頁面

HOW TO:判斷 ASP.NET Web 網頁的叫用方式