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

来源:http://www.cnblogs.com/wangzhiliang/archive/2016/03/14/4973379.html
-Advertisement-
Play Games

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、我的Vaio Fit15e的無線網卡是BCM43142,裝了Ubuntu後為了裝驅動折騰了好久,因為這款網卡在Broadcom官網都找不到驅動,google了一大圈,一個最簡單的命令可以解決這個問題 sudo apt-get install bcmwl-kernel-source 2、電腦裝的W
  • Ubuntu線上安裝mysql 2016/3/11 1.確保ubuntu可以正常上網 2.更改軟體源(詳情見上一篇隨筆) 3.執行:sudo apt-get updat(sudo是提升許可權, apt-get update更新最新的套件資訊) 4.執行:sudo apt-get install mys
  • Ubuntu更改軟體源 2016/3/11 1.啟動器中打開“ubuntu軟體中心” 2.點擊“編輯”選擇“軟體源” 3.在“下載自”選項中點擊“其他站點” 4.找到“中國” 5.選擇“mirror.163.com”,然後選擇“選擇伺服器” 6.輸入管理員密碼即可
  • 從mono的官網上查,debian的步驟寫得太亂了。其實總結起來,就是這麼幾步: 1 apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
  • 銳捷校園網虛擬機聯網問題 2016/3/10 問題描述: 銳捷校園網下註冊過MAC地址的PC機可以正常上網,但是虛擬機vmwareworkstation使用以下3種網路連接還是不可以正常上網。 橋接模式 NAT模式 僅主機模式 問題分析: 只有在網路中心綁定過MAC地址的PC機使用銳捷客戶端獲得ip
  • ActivateKeyboardLayout 設置調用線程或當前進程為輸入區域設置標識符; System.Windows.Forms.InputLanguage.CurrentInputLanguage 獲取或設置當前線程的輸入語言 /// <summary> /// 設置調用線程或當前進程為輸入區
  • 六、Shell腳本編程詳解將上述五部分的內容,串聯起來,增加對Shell的瞭解01.shell腳本shell:##perl#python#php#jsp不同的腳本執行不同的文本,執行的角色是不一樣的;#shell scripts(UNIX Like系統的原則有一條:程式越短越好)#bash csh
  • userdel - delete a user account and related files在Linux中,userdel命令的功能是刪除系統中的用戶及相關的文件語法 userdel [選項] username參數 -r --remove:刪除用戶時,同時刪除用戶的家目錄。預設情況下,並不刪除
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...