說起來有點慚愧,做了這麼久的.NET,今天才真正搞明白Server.Transfer
先來看看代碼:
B.aspx
public string TextBox1Text
{
get
{
return TextBox1.Text;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("A.aspx");
}
A.ASPX
protected void Page_Load(object sender, EventArgs e)
{
B b = Context.Handler as B;//獲取到B頁面的引用
if (b != null)
{
Response.Write("人家是A.aspx哦!<br/>");
Response.Write("你在B頁面輸入的是:"+b.TextBox1Text);
}
else
{
Response.Write("你跑過來幹嘛!<br/>");
}
}
這個纔可以說是面象對象開發所使用的方法,其使用Server.Transfer方法把流程從當前頁面引導到另一個頁面中,新的頁面使用前一個頁面的應答流,所以這個方法是完全面象對象的,簡潔有效。
Server.Transfer是從當前的ASPX頁面轉到新的ASPX頁面,服務器端執行新頁並輸出,在新頁面中通過Context.Handler來獲得前一個頁面傳遞的各種數據類型的值、表單數據、QueryString.由於重定向完全在服務器端完成,所以客戶端瀏覽器中的URL地址是不會改變的。調用Server.Transfer時,當前的ASPX頁面終止執行,執行流程轉入另一個ASPX頁面,但新的ASPX頁面仍使用前一ASPX頁面創建的應答流。
ps:比較Server.Transfer和Response.Redirect的區別。
(1)Server.Transfer在服務器端完成,所以客戶端瀏覽器中的URL地址是不會改變的;Response.Redirect是客戶端完成,向服務器端提出新的頁面處理請求,所以客戶端瀏覽器中的URL地址是會改變的。
(2)Server.Transfer在服務器端完成,不需要客戶端提出請求,減少了客戶端對服務器端提出請求。
(3)Server.Transfer只能夠轉跳到本地虛擬目錄指定的頁面,也就是工程項目中的頁面,而Response.Redirect則十分靈活,可以跳轉到任何URL地址。
(4)Server.Transfer可以將前一個頁面的各種類型的值傳到新的頁面;Response.Redirect則只能藉助URL中帶參數或是結合上面四種辦法把各種類型的值傳到新的頁面。
優點:1.直接在服務器端重定向,使用簡單方便,減少了客戶端對服務器端提出請求;2.可以傳遞各種數據類型的值和控件的值。
缺點:1.客戶端瀏覽器中的URL地址是不改變,會導致在新的頁面可能出現一些意想不到的問題。比如如果源頁面和目的頁面不在同一個虛擬目錄或其子目錄下,那麼使用相對路徑的圖片、超鏈接都會導致錯誤的指向。
使用方法:1.在源頁面的代碼中,使用Page類的Server.Transfer跳到另一個頁面傳遞頁面數據:Server.Transfer("b.aspx","false");2.在目的頁面中,使用Context.Handler來接收數據:FormerPage formerPage = (FormerPage)Context.Handler; 然後用formerPage的屬性和方法來獲取前一個頁面的值,或者直接用Context.Items["myParameter "]