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