在開發 ASP.NET 網站時,您經常需要從一個網頁重定向(導航)到另一個網頁,同時希望能夠將信息從源頁傳遞到目標頁。例如,如果您正在開發一個保險網站,用一個頁面來收集基本信息(用戶信息、保險產品信息等),用另一個頁面用來完成支付過程,而支付頁面又需要前一頁面的部分信息,這時就需要進行頁面重定向和傳值。
實現網頁之間信息傳遞的方式有很多種,例如,在頁面上添加<a>標簽並設置其href屬性、運用 windows.location 對象、在後台代碼中實現等。這裡主要介紹如何在後台代碼中實現網頁之間的重定向和傳值。
新建初始項目
文件 -> 新建 Asp.Net Web 應用程序 -> Empty -> 取名為 PassValueDemo
添加新建項 -> Web窗體 -> SourcePage.aspx(源頁)-> 繼續添加Web窗體 -> TargetPage.aspx(目標頁)
備注:示例在VS2013學習版中演示
網頁相互調用
Response.Redirect 方法用於將客戶端重定向到新的 URL。
備注:URL 可以是絕對路徑,如 http://www.baidu.com 也可以是相對路徑,如 TargetPage.aspx ,但某些浏覽器可能會拒絕相對路徑
//從 SourcePage.aspx 重定向到服務器上的另一個網頁 TargetPage.aspx Response.Redirect("TargetPage.aspx"); //從 SourcePage.aspx 重定向到任一URL地址 Response.Redirect("http://www.baidu.com");
Server.Transfer 方法用於終止當前頁的執行,並使用指定的頁 URL 路徑來開始執行一個新頁。
備注:1. URL 中指定的頁面必須在服務器端存在(不能是 http://www.baidu.com 等)
2. ASP.NET 執行此方法時不會驗證當前用戶是否有訪問 URL 的權限,若需驗證用戶權限,可以考慮用 Response.Redirect 或 WindowsPrincipal.IsInRole 方法
3. 頁面跳轉後浏覽器中的 URL 地址不變,還是顯示原來的 URL
//終止當前頁 SourcePage.aspx ,執行服務器上的另一網頁 TargetPage.aspx Server.Transfer("TargetPage.aspx");
網頁之間傳遞值
1. 使用查詢字符串
HttpRequest.QueryString 屬性(NameValueCollection 類型)
示例:下面的代碼示例演示兩種方法可以獲取名為"fullname"的查詢字符串變量的值。
在每個示例中,如果 URL 是 http://localhost:49495/Target.aspx?fullname=Fadi%20Fakhouri ,則返回的值為"Fadi Fakhouri",因為 %20 是 URL 解碼為一個空格字符。如果該 URL 不具有 fullname 查詢字符串 ID,則返回的值將為 null。
第一行代碼會查找鍵僅在查詢字符串中的"fullname",第二行查找密鑰"fullname"中的所有 HTTP 請求的集合。
//從 QueryString 中獲取指定的對象 string fullname1 = Request.QueryString["fullname"]; //從 QueryString、Form、Cookies 或 ServerVariables 集合獲取指定的對象 string fullname2 = Request["fullname"];
2. 使用會話狀態
2.1 HttpCookie 類
獲取和設置各 Cookie 的屬性。 HttpCookieCollection 類提供存儲、檢索和管理多個 Cookie 的方法。
ASP.NET 包含兩個內部 Cookie 集合。通過 HttpRequest 對象的 Cookies 集合訪問的集合,包含以 Cookie 標頭形式由客戶端傳輸到服務器的 Cookie。通過 HttpResponse 對象的 Cookies 集合訪問的集合包含一些新 Cookie,這些 Cookie 在服務器上創建並以 Set-Cookie HTTP 響應標頭的形式傳輸到客戶端。
示例:下面的代碼示例演示如何對 HttpRequest 對象中名為 DateCookieExample 的 Cookie 進行檢查。
如果找不到該 Cookie,則將創建它並將其添加到 HttpResponse 對象。Cookie 設置為 10 分鐘後過期。
<%@ Page Language="C#" %>
<!DOCTYPE html> <body> <form id="form1" runat="server"> <asp:Label ID="labCookie" runat="server"></asp:Label> </form> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); // 從當前請求 HttpRequest 中獲取 Cookie HttpCookie cookie = Request.Cookies.Get("DateCookieExample"); // 檢查當前請求中是否存在 Cookie if (cookie == null) { sb.Append("未從客戶端獲取到 Cookie "); sb.Append("正在創建 Cookie 並添加到服務器的 http 響應對象中<br/>"); // 創建 Cookie cookie = new HttpCookie("DateCookieExample"); // 把 Cookie 的值設置為當前時間 cookie.Value = DateTime.Now.ToString(); // 設置 Cookie 的過期時間為10分鐘 cookie.Expires = DateTime.Now.AddMinutes(10d); // 把 Cookie 添加到當前的http響應 HttpResponse 中 Response.Cookies.Add(cookie); } else { sb.Append("從客戶端獲取到的 Cookie <br/>"); sb.Append("Cookie 名稱: " + cookie.Name + "<br/>"); sb.Append("Cookie 值: " + cookie.Value + "<br/>"); sb.Append("Cookie 過期時間: " + cookie.Expires.ToString() + "<br/>"); } labCookie.Text = sb.ToString(); } </script> </body>
2.2 Page.Session 屬性(HttpSessionState 類型)
該屬性提供有關當前請求的會話的信息。為從 ASP.NET 應用程序請求頁或文檔的每個用戶維護一個 Session 對象。當用戶在應用程序中從一頁移動到另一頁時,存儲在 Session 對象中的變量不會被放棄;相反,只要用戶在應用程序中訪問頁,這些變量就將保持。
有關會話狀態的更多信息,請參見 ASP.NET Session State Overview。
Session["Name"] = tbName.Text; Session["Email"] = tbEmail.Text;
2.3 Page.Application 屬性(HttpApplicationState 類型)
ASP.NET 應用程序是單個 Web 服務器上的某個虛擬目錄及其子目錄范圍內的所有文件、頁、處理程序、模塊和代碼的總和。
HttpApplicationState 類的單個實例在客戶端第一次從某個特定的 ASP.NET 應用程序虛擬目錄中請求任何 URL 資源時創建。對於 Web 服務器上的每個 ASP.NET 應用程序都要創建一個單獨的實例。然後通過內部 Application 對象公開對每個實例的引用。
應用程序狀態不在網絡場(應用程序被多台服務器承載)或網絡園(應用程序被同一台計算機上的多個進程承載)中共享。
Application.Lock(); tbName.Text = Application["Name"]; Application.UnLock();
3. 從源頁獲取公共屬性值
如果源頁專門設計為與目標頁共享信息,並且這兩個頁都是 ASP.NET 網頁,則可以在源頁中添加公共屬性,用於公開要在頁之間共享的信息。然後,可以在目標頁中讀取這些屬性的值。(備注:僅當這兩個頁位於同一個 Web 應用程序中時,才能在目標頁中讀取源頁屬性。)
3.1 從源頁獲取公共屬性值
在源頁 SourcePage.aspx 中,創建一個或多個公共屬性。
3.1.1 下面的代碼示例演示一個名為 CurrentCity 的屬性,該屬性公開名為 textCity 的 TextBox 控件的值。
public String CurrentCity { get { return textCity.Text; } }
備注:在源頁上創建的、主要用於為跨頁發送公開值的屬性通常是只讀屬性。盡管源頁可以包含公共讀/寫屬性,但是通過目標頁屬性設置源頁屬性一般沒有任何效果,因為不會保留此值。
3.1.2 在目標頁 TargetPage.aspx 上,添加一個指向源頁的 @ PreviousPageType 頁面指令。
下面的代碼示例演示一個引用名為 SourcePage.aspx 的源頁的 PreviousPageType 指令。
<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>或者
<%@ Reference Page="~/SourcePage.aspx" %>
備注:PreviousPageType 指令會導致頁的 PreviousPage 屬性被類型化為源頁類。
3.1.3 在目標頁 TargetPage.aspx 代碼中,使用 PreviousPage 屬性的強類型成員讀取源代碼屬性。
下面的代碼示例讀取源頁 SourcePage.aspx 中定義的 CurrentCity 屬性的值。
Label1.Text = PreviousPage.CurrentCity;
3.2 從同一個應用程序的源頁中獲取控件信息
如果源頁 SourcePage.aspx 和目標頁 TargetPage.aspx 都是 ASP.NET 網頁,並且位於同一個 Web 應用程序中,則可以在目標頁中讀取源頁中的控件值。如果源頁不公開包含所需信息的公共屬性,則可以使用此策略。
在目標頁中,通過使用目標頁的 PreviousPage 屬性獲取對源頁的引用,然後調用 FindControl 方法獲取對所需控件的引用。
下面的代碼示例獲取源頁 SourcePage.aspx 的 TextBox1 控件的值,並將其顯示在名為 Label1 的控件中:
if (Page.PreviousPage != null) { TextBox SourceTextBox = (TextBox)Page.PreviousPage.FindControl("TextBox1"); if (SourceTextBox != null) { Label1.Text = SourceTextBox.Text; } }
注:FindControl 方法用於查找當前命名容器中的控件。如果正在查找的控件位於其他控件中(通常位於模板中),則必須首先獲取對該容器的引用,然後搜索該容器,以查找要獲取的控件。
3.3 從其他應用程序的源頁中獲取發送信息
如果源頁和目標頁不在同一個 Web 應用程序中,則可以在目標頁中讀取源頁的發送的值。如果目標頁是 ASP.NET 網頁,但源頁不是,則也可以使用此技術。
備注:只能獲取發送的值,而無法讀取頁中的任意控件的值。
在目標頁 TargetPage.aspx 中,讀取 Form 集合,此集合返回名稱/值對的字典(每一個發送的值對應一個名稱/值對)。
下面的代碼示例演示源頁 SourcePage.aspx 中每個發送的控件的 ID 和值,並在名為 Label1 的標簽中顯示發送的值。
void Page_Load(object sender, EventArgs e) { System.Text.StringBuilder displayValues = new System.Text.StringBuilder(); System.Collections.Specialized.NameValueCollection postedValues = Request.Form; String nextKey; for(int i = 0; i < postedValues.AllKeys.Length - 1; i++) { nextKey = postedValues.AllKeys[i]; if(nextKey.Substring(0, 2) != "__") { displayValues.Append("<br>"); displayValues.Append(nextKey); displayValues.Append(" = "); displayValues.Append(postedValues[i]); } } Label1.Text = displayValues.ToString(); }
備注:ASP.NET 網頁中的發送信息包括隱藏字段的值,如 __VIEWSTATE、__EVENTTARGET 和 __EVENTARGUMENT,這些值在頁中進行內部處理時使用。上面的代碼示例排除以兩個下劃線 (__) 作為開頭命名的發送字段的值。
參考網站:
https://msdn.microsoft.com/zh-cn/library/6c3yckfw(v=vs.100).aspx
https://msdn.microsoft.com/en-us/data
http://www.asp.net/web-forms
http://www.codeplex.com/
http://www.codeproject.com/
http://referencesource.microsoft.com/