ASP.NET 網頁中的跨頁發送PreviousPage


默認情況下,在 ASP.NET 網頁中引起回發的按鈕和其他控件將頁提交回該頁本身。這是 ASP.NET 網頁在其正常的處理過程中所要經歷的往返周期的一部分。在某些情況下,可能需要將一個頁發送到其他頁。例如,您可能正在創建一個收集每個頁上不同信息的多頁窗體。在此情況下,可以將頁中的某些控件(實現 IButtonControl 接口的控件,如 Button 控件)配置為發送至不同的目標頁。這被稱為跨頁發送。跨頁發送與使用 Transfer 方法重定向到其他頁相比,具有一些優點。

從源頁獲取信息

為跨頁發送配置頁時,您通常需要從源頁中獲取信息。這可能包括來自頁上控件的信息(即由瀏覽器發送的信息),以及源頁的公共屬性。

獲取控件值

Page類公開一個名為PreviousPage的屬性。如果源頁和目標頁位於同一 ASP.NET 應用程序中,則目標頁中的PreviousPage屬性包含對源頁的引用。(如果該頁不是跨頁發送的目標或者這些頁位於不同的應用程序中,則不會初始化PreviousPage屬性。) 默認情況下,PreviousPage屬性類型化為Page。

如果源頁和目標頁位於不同的應用程序中,則無法直接獲取頁上控件的值,但可以從 Form 字典中讀取發送的數據。因為源頁經過散列處理,所以不能從源頁中讀取視圖狀態。如果要在源頁中存儲值並使這些值可供其他應用程序中的目標頁使用,則可以將這些值作為字符串存儲在源頁的隱藏字段中,並在目標頁中通過 Request.Form 來訪問它們。

在 PreviousPage 屬性中使用引用,便可以搜索源頁上的控件並提取這些控件的值。通常使用 FindControl 方法來執行此操作。

if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

FindControl 方法在當前的命名容器中查找控件。如果要查找的控件位於另一控件內(通常位於模板內),則必須先獲取對該容器的引用,然后才能在該容器中查找要獲取的控件。在下面的代碼示例中,源頁包含一個 Login 控件,並具有一個 LayoutTemplate 容器,而該容器又包含一個名為 UserName 的 TextBox 控件。該代碼獲取 UserName 控件的值。

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 String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}

在源頁上創建的、主要用於為跨頁發送公開值的屬性通常是只讀屬性。盡管源頁可以包含公共讀/寫屬性,但是通過目標頁屬性設置源頁屬性一般沒有任何效果,因為不會保留此值。

如果目標頁中包含指向源頁的 PreviousPageType 指令,則可以使用下面的代碼訪問源頁的 CurrentCity 屬性。

Label1.Text = PreviousPage.CurrentCity;

獲取對源頁的強類型引用的另一種方法是在引用源頁的目標頁中包含一個@ Reference指令,正如引用要在頁中使用的任何類型一樣。在此情況下,您可以在目標頁中獲取目標頁的PreviousPage屬性並將其強制轉換為源頁類型,如下面的代碼示例所示。

SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

@ Reference的用法例子下載

檢查目標頁中的回發

在跨頁回發過程中,源頁控件的內容被發送至目標頁,並且瀏覽器執行 HTTP POST 操作(不是 GET 操作)。但在目標頁中,在跨頁發送之后,IsPostBack屬性便立即成為 false。盡管該行為是 POST 的行為,但跨頁發送並不是到目標頁的回發。因此,IsPostBack 設置為 false,並且目標頁可以通過它的第一次代碼。

如果這在您的應用程序中有用,則可以確定目標頁是否由於跨頁發送而正在運行。為此,您可以對目標頁的PreviousPage屬性返回的頁引用的IsCrossPagePostBack屬性進行測試,如下面的代碼示例所示。

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)。

跨頁發送與 Server.Transfer

PreviousPage屬性和 PreviousPageType 指令在調用目標頁的兩種情況下都很有用:在跨頁回發中(這是一種基於客戶端的傳輸)和使用Transfer 方法時(這是基於服務器的操作)。在以上兩種操作中,目標頁中的代碼都可以使用PreviousPage 屬性獲取對源頁的引用。

在目標頁中,確定頁是通過跨頁發送還是 Server.Transfer 操作調用可能很重要。為了幫助您執行此操作,Page 類公開了一個名為IsCrossPagePostBack 的屬性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM