程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> ASP.NET 網頁的重定向和傳值,asp.net網頁重定向

ASP.NET 網頁的重定向和傳值,asp.net網頁重定向

編輯:C#入門知識

ASP.NET 網頁的重定向和傳值,asp.net網頁重定向


在開發 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/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved