搜尋
首頁後端開發C#.Net教程詳解ASP.NET 頁面之間傳值的幾種方式

開篇概述

對於任何一個初學者來說,頁面之間傳值可謂是必經之路,卻又是他們的難點。其實,對大部分高手來說,未必不是難點。

回想2016年面試的將近300人中,有實習生,有應屆畢業生,有1-3年經驗的,有3-5年經驗的,有5-10年經驗的,對於所有的面試者,我幾乎問了同一題:"請說說你所知道的頁面之間傳值的幾種形式和方法,並闡述他們的原理和過程",關於這道題,從大家的回答來看,結果並不是很理想,從種類上來說,大部分人回答5種左右,極少部分能回答8種,沒有超過8種的,但從深度上來說,很少有人能透徹的分析每種方法的原理和過程,(當然,要想透徹的分析這些原理和過程,需要研究底層的東西,如page 生命週期和page原理,反射,IIS如何解析請求等,CLR,GC,反編譯等)。

大致概括一下,ASP.NET 頁面之間傳遞值得方式大致可以分為以下幾種:Request.QueryString["name"],Request.Form("name"),Session,Cookie,Cache,Application,Server .Transfer,Database,HttpContext的Item屬性,Files,DataBase等等。

 詳解每個方法

一、Request.QueryString

核心程式碼:

protected void getQueryString_Click(object sender, EventArgs e)
 {
   string QueStr = Request.QueryString["name"];
   Response.Write(QueStr);
 }

總結:

1、Request.QueryString:取得http查詢字串變數集合。有兩重載,即Request.QueryString[string name]和Request.QueryString[int index];

2、Request.QueryString主要是取得url中的「?」之後的參數,如url:a.aspx?name ="queryString",則Request.QueryString["name"]的值為「queryString」。

 二、Request.Form

 核心程式碼:

protected void getQueryString_Click(object sender, EventArgs e)
 {
   string strQueForm = Request.Form["TextBox1"];
   Response.Write(strQueForm);
 }

總結:

1、Request.Form 取得窗體變數集合。有兩重載,即Request.Form[string name]和Requst.Form[int index]。

2、取得表單指定名字的參數值。

三、Session

1、Session基本操作

a、創建Session

//创建Session
    public void createSession(string[] arrStr)
    {
      //创建数组
      string[] str=new string[arrStr.Length];
      for (int i = 0; i < arrStr.Length; i++)
      {
        str[i] = i.ToString();
        Session[str[i]] = arrStr[i];
      }
    }

b、取得Session的值

string getSessionValue=Session["name"].ToString();

e、結束Session會話

//遍历Session
    public void getSession()
    {
      IEnumerator sessionEnum = Session.Keys.GetEnumerator();
      while (sessionEnum.MoveNext())
      {
        Response.Write(Session[sessionEnum.Current.ToString()].ToString()+";");
      }
    }


2、Session資料存放形式和位置 

//清空Session,但不结束会话
    public void clearSession()
    {
      Session.Clear();
    }


註解:

b、Inproc:In Process縮寫,表示將Session儲存在IIS進程內,但注意,該種方式雖然效能高,但IIS重啟是,遺失Session訊息;(預設值)


c、SateServer:將Session儲存在ASP.NET狀態服務程序中(重新啟動Web運用程式時保留會話狀態,並使會話狀態可以用於網路中的多個Web伺服器);

d、將Session儲存在SQL Server中

cookieless :設定客戶端儲存Session形式和位置

a、true:使用cookieless模式,這時客戶端的Session資訊就不再使用Cookie儲存了,而是將其透過URL儲存;

b、false:使用kookie模式,預設值.

timeout 設定經過多少分鐘後伺服器自動放棄Session資訊。預設為20分鐘;

stateConnectionString 設定將Session資訊儲存在狀態服務時使用的伺服器名稱和連接埠號碼,例如:"tcpip=127.0.0.1:42424」。當mode的值是StateServer是,這個屬性是必要的。 (預設連接埠42424);

sqlConnectionString 設定與SQL Server連線時的連線字串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=joye"。當mode的值是SQLServer時,這個屬性是必要的;

stateNetworkTimeout 設定當使用StateServer模式儲存Session狀態時,經過多少秒空閒後,斷開Web伺服器與儲存狀態資訊的伺服器的TCP/IP連接的。預設值是10秒;

 3、Session原理

 為什麼引入Session?大家知道,因為http是無狀態協議,因此,Session正彌補了這個缺陷。當然,Session作用遠遠不止於這些,這裡就不多論述。

Session在ASP.NET中,表示客戶端(Goggle,Firefox,IE等)與伺服器端的會話,用來儲存特定會話訊息,準確來說,是用來儲存特定使用者資訊。當客戶端向伺服器發送請求時,如登陸用戶ID,伺服器接收到該請求,伺服器端Session產生一個與該登陸用戶相關的SessionID,並將SessioID傳回給客戶端(Goggle,Firefox,IE等),在新會話開始時,伺服器將SessionID當作cookie儲存在使用者的瀏覽器中。

總結:

1、定義:System.Web.SessionState.HttpSessionState  Page.Session //取得ASP.NET提供的目前Session物件。

2、特性:

a、Session中文意思為“會話”,在ASP.NET中,表示客戶端和伺服器之間的會話,web中常用會話之一。

b、Session儲存在伺服器端記憶體中。

c、Session可以儲存任何類型的數據,包括自訂物件。

d、Session与Session间是相互独立的,互不干扰。

e、Session与Cookie配对使用,Session在服务器端产生SessionID,并将该SessionID返回给客户端(IE,FireFox,Google等),客户端Cookie来存储该SessionID,整过会话过程中,只要保存SessionID的Cookie不丢失,则Session的信息就不会丢失。

f、Session保存的数据可以跨页访问,即跨页面是全局的。

g、Session不能跨进程访问,只能由该会话用户访问。

h、可以在不结束会话的条件下,清除Session信息,即调用Session.Clear();

i、当会话结束,过期,服务器就会清除Session对象。

j、Session常用于保存登录用户的ID. 

四、Application

核心代码:

 (1)a.aspx

private void Button1_Click(object sender, System.EventArgs e)
{
  Application["name"] = Label1.Text;
}


(2)b.aspx

private void Page_Load(object sender, EventArgs e)
{
  string name;
  Application.Lock();
  name = Application["name"].ToString();
  Application.UnLock();
}


总结:

1、Application对象的作用范围是整个全局,也就是说对所有用户都有效。它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session变量的区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。可能有人会问,既然所有用户都可以使用application变量,那他可以用在什么场合呢?这里举个例子:网站访问数。多个请求访问时都可以对它进行操作。

2、优点:使用简单,消耗较少的服务器资源;不仅能传递简单数据,还能传递对象;数据量大小是不限制的。

3、缺点:作为全局变量容易被误操作。所以单个用户使用的变量一般不能用application。

4、在源页面的代码中创建你需要传递的名称和值构造Application变量:Application["name"]="Value(Or Object)";在目的页面的代码使用Application变量取出传递的值。Result = Application["name"]。

5、常用lock和unlock方法用来锁定和解锁,为了防止并发修改。 

五、Cache

核心代码:

//Class1
 
 Cache["id"] = TextBox1.Text;
 Response.Redirect("~/WebForm1.aspx");
 
//Class2
 
if (Cache["id"]!=null)
 {
   Label1.Text = Cache["id"].ToString();
 }
 
//移除缓存
Cache.Remove("id");
 
//如果 Cache["id"]为空,则传值失败。可使用如下方法实
//限期为10分钟
 Cache.Insert("id",TextBox1.Text,null,Cache.NoAbsoluteExpiration,new TimeSpan(0,10,0));


总结:

1、应用程序中的缓存机制用于将需要大量服务器资源来创建的对象存储在内存中,以此大大改进应用程序的性能。这个机制同样可以用来传值。

2、与其他方法不同的是,该方法需要设置缓存项优先级和缓存时间。因为当系统内存缺乏时,缓存机制会自动移除很少使用或优先级较低的项,从而造成传值失败。

3、该方法的优点是传递数据的大小和数量无限制,速度快。缺点是缓存机制的操作相对比较复杂。

六、Cookie

 核心代码: 

//Class1
 
HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie");
Response.Redirect("~/Class2.aspx");
//Class2
 
Label1.Text = Request.Cookies["testCookie"].Value;


总结:

1、Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站时用户的ID,用户的偏好等,用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。

2、Cookie通过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转换为字符串的形式。

3、与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。

4、使用简单,是保持用户状态的一种非常常用的方法。比如在购物网站中用户跨多个页面表单时可以用它来保持用户状态。

5、常常被人认为用来收集用户隐私而遭到批评。

6、安全性不高,容易伪造。 

七、Context.Items["id"]

核心代码:

//Class1
 
 Context.Items["id"]=TextBox1.Text;
 Server.Transfer("~/Class2.aspx");
 
//Class2
 Label1.Text=Context.Items["id"].ToString();
 Context.Items.Remove("id"); //移除项


1、Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求、响应、以及上文中的Session 和Application 等信息。

2、可以使用此对象在网页之间共享信息,从而实现页面间的传值。

3、与使用 Form 的方法类似,该方法也能保持大量的数据,缺点也相同,但使用方法相对比较简单。

八、ViewState

核心代码:

//Class1
ViewState["id"]=TextBox1.Text; //数据保存
Label1.Text=ViewState["id"].ToString(); //数据取出
ViewState.Remove("id"); //数据移除


总结:

1、ViewState 是ASP.NET 用来在同一页面的多个请求之间保存和还原服务器控件视图状态的一种机制。与传统的“同一页面”不同,ASP.NET 中“同一页面”的每一个请求都会导致服务器重新生成该页面,但是新生成的页面并不包含原来页面的数据。(页面无状态性)

2、ViewState 的任务就是保存原来页面中服务器控件视图状态的数据供新页面使用。从这个意义上讲,ViewState 也可以看作是一种在页面间传递数据的工具。

3、ViewState 的工作原理是:作为一个隐藏的窗体字段在客户端和服务器之间传递,可见,滥用ViewState 会加重页面回传的负担,从而降低应用程序的性能。

此外,ViewState 也能被控件、页面和应用程序禁用。

九、web.config和machine.config

核心代码:

//Class1
using System.Web.Configuration;
WebConfigurationManager.AppSettings.Set("userName",TextBox1.Text);
Response.Redirect("~/Class2.aspx");
//Class2
using System.Web.Configuration;
Label1.Text = WebConfigurationManager.AppSettings["userName"];


总结:

1、每个Web运用程序继承web.config文件和machine.config文件的设置。

2、web.config和machine.config这两种文件保存数据一般都很小,多为明文,特别适合保存一些字符串常量,如数据库连接信息。此外,web.config文件是可以扩展的,因此,也可以用来传递变量。由于这两种文件会被自动缓存,所以不存在因磁盘IO产生的性能瓶颈等问题。要注意的是文件中某些设置会导致文件被修改后Web运用程序的重启。

3、web.config:你可以向单个Web运用程序运用设置。例如,你可能会希望设置特定的验证方法、调试的类型、默认语言或自定义的错误页面。但如果你要使用这些设置,必须把web.config文件放到web运用程序的根虚拟目录下。要想在Web运用程序中进一步配置自己的子目录,需要 在这些文件夹中放置附加的web.config。(关于ASP.NET web.config文件详细介绍,可参考我另外一篇博客:ASP.NET web.config)

4、machine.config:从c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目录中的一个叫macine.config的文件开始 配置。machine.config文件定义支持的配置文件节,配置ASP.NET工作者进程,注册可用于高级特性(如配置文件、成员资格以及基于角色的安全等)提供程序。(关于ASP.NET machine.config文件的详细介绍,我之后会写一篇文章来介绍)     

 十、Static

核心代码:

//class1
public static string userName;//在class1中定义静态全局变量
userName=txtBoxUserName.Text;
Response.Redirect("~/class2.aspx");
//class2
Label1.Text=Src.id;


总结:

1、这个应该是非常容易理解的,在ASP.NET中,每个页面对应一个具体的类,既然如此,那么页面之间的传递,我们就可以归结为:类与类之间数据的传递。想到这一步,问题应该就迎刃而解了, 因为我们可以利用类之间的公关静态变量来解决这个问题。

2、若合理利用,可以有效地提高数据传递效率,但若滥用,可能会导致用户或页面间数据紊乱,存在一定风险和隐患,应谨慎使用。

提出以下问题:大家可以分析一下,以下代码有什么问题?

//Class1
 
 protected void btnRedirect_Click(object sender, EventArgs e)
    {
        
      string userName = txtBoxUserName.Text;
      Response.Redirect("~/Class2.aspx");
    }
 
//Class2
 
Lable1.Text=userName;


十一、补充常用页面之间跳转

1.最常用的页面跳转(原窗口被替代):Response.Redirect("XXX.aspx");

2.利用url地址打开本地网页或互联网:Respose.Write("");

3.原窗口保留再新打开另一个页面(浏览器可能阻止,需要解除):Response.Write("<script>window.open(&#39;XXX.aspx&#39;,&#39;_blank&#39;)</script>");

4.效果同1中的另一种写法:Response.Write("<script>window.location=&#39;XXX.aspx&#39;</script>");

5.也是原窗口被替代的 (常用于传递session变量的页面跳转):Server.Transfer("XXX.aspx");

6.原窗口保留,以对话框形式打开新窗口:Response.Write("<script>window.showModelessDialog(&#39;XXX.aspx&#39;)</script>");

7.对话框形式打开新窗口,原窗口被代替:Response.Write("<script>window.showModelDialog(&#39;XXX.aspx&#39;)</script>");

8.打开简洁窗口:Respose.Write("");

9.利用vs2008端口:System.Diagnostics.Process.Start(http://localhost:3210/系统管理员.aspx);

注释:比较简单,我这里就不论述了。

总结:

关于页面之间传值,还有很多方法,如文件传值、数据库传值,ViewBag等等,在这里就不一一论述了。若以后有时间,将会在此基础上补充,并逐步完善该篇博文。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多详解ASP.NET 页面之间传值的几种方式相关文章请关注PHP中文网!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
C#作為.NET語言:生態系統的基礎C#作為.NET語言:生態系統的基礎May 02, 2025 am 12:01 AM

C#是微軟在2000年發布的編程語言,旨在結合C 的強大功能和Java的簡潔性。 1.C#是一種類型安全、面向對象的編程語言,支持封裝、繼承和多態。 2.C#的編譯過程將代碼轉化為中間語言(IL),然後在.NET運行時環境(CLR)中即時編譯成機器碼執行。 3.C#的基本用法包括變量聲明、控制流和函數定義,而高級用法涵蓋異步編程、LINQ和委託等。 4.常見錯誤包括類型不匹配和空引用異常,可通過調試器、異常處理和日誌記錄來調試。 5.性能優化建議包括使用LINQ、異步編程和提高代碼可讀性。

c#vs. .net:澄清關鍵差異和相似之處c#vs. .net:澄清關鍵差異和相似之處May 01, 2025 am 12:12 AM

C#是一種編程語言,而.NET是一個軟件框架。 1.C#由微軟開發,適用於多平台開發。 2..NET提供類庫和運行時環境,支持多語言。兩者協同工作,構建現代應用。

超越炒作:評估C#.NET的當前作用超越炒作:評估C#.NET的當前作用Apr 30, 2025 am 12:06 AM

C#.NET是一個強大的開發平台,結合了C#語言和.NET框架的優勢。 1)它廣泛應用於企業應用、Web開發、遊戲開發和移動應用開發。 2)C#代碼編譯成中間語言後由.NET運行時環境執行,支持垃圾回收、類型安全和LINQ查詢。 3)使用示例包括基本控制台輸出和高級LINQ查詢。 4)常見錯誤如空引用和類型轉換錯誤可以通過調試器和日誌記錄解決。 5)性能優化建議包括異步編程和優化LINQ查詢。 6)儘管面臨競爭,C#.NET通過不斷創新保持其重要地位。

C#.NET的未來:趨勢和機遇C#.NET的未來:趨勢和機遇Apr 29, 2025 am 12:02 AM

C#.NET的未來趨勢主要集中在雲計算、微服務、AI和機器學習集成以及跨平台開發三個方面。 1)雲計算和微服務:C#.NET通過Azure平台優化雲環境表現,支持構建高效微服務架構。 2)AI和機器學習集成:借助ML.NET庫,C#開發者可在應用中嵌入機器學習模型,推動智能化應用發展。 3)跨平台開發:通過.NETCore和.NET5 ,C#應用可在Windows、Linux和macOS上運行,擴展部署範圍。

C#.NET開發今天:趨勢和最佳實踐C#.NET開發今天:趨勢和最佳實踐Apr 28, 2025 am 12:25 AM

C#.NET開發的最新動態和最佳實踐包括:1.異步編程提高應用響應性,使用async和await關鍵字簡化非阻塞代碼;2.LINQ提供強大查詢功能,通過延遲執行和表達式樹高效操作數據;3.性能優化建議包括使用異步編程、優化LINQ查詢、合理管理內存、提升代碼可讀性和維護性、以及編寫單元測試。

C#.NET:使用.NET生態系統構建應用程序C#.NET:使用.NET生態系統構建應用程序Apr 27, 2025 am 12:12 AM

如何利用.NET構建應用?使用.NET構建應用可以通過以下步驟實現:1)了解.NET基礎知識,包括C#語言和跨平台開發支持;2)學習核心概念,如.NET生態系統的組件和工作原理;3)掌握基本和高級用法,從簡單控制台應用到復雜的WebAPI和數據庫操作;4)熟悉常見錯誤與調試技巧,如配置和數據庫連接問題;5)應用性能優化與最佳實踐,如異步編程和緩存。

C#作為多功能.NET語言:應用程序和示例C#作為多功能.NET語言:應用程序和示例Apr 26, 2025 am 12:26 AM

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

C#.NET用於網絡,桌面和移動開發C#.NET用於網絡,桌面和移動開發Apr 25, 2025 am 12:01 AM

C#和.NET適用於Web、桌面和移動開發。 1)在Web開發中,ASP.NETCore支持跨平台開發。 2)桌面開發使用WPF和WinForms,適用於不同需求。 3)移動開發通過Xamarin實現跨平台應用。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境