詳解ASP.NET 頁面之間傳值的幾種方式
開篇概述
對于任何一個初學(xué)者來說,頁面之間傳值可謂是必經(jīng)之路,卻又是他們的難點。其實,對大部分高手來說,未必不是難點。
回想2016年面試的將近300人中,有實習(xí)生,有應(yīng)屆畢業(yè)生,有1-3年經(jīng)驗的,有3-5年經(jīng)驗的,有5-10年經(jīng)驗的,對于所有的面試者,我?guī)缀鯁柫送坏李}:"請說說你所知道的頁面之間傳值的幾種形式和方法,并闡述他們的原理和過程",關(guān)于這道題,從大家的回答來看,結(jié)果并不是很理想,從種類上來說,大部分人回答5種左右,極少部分能回答8種,沒有超過8種的,但從深度上來說,很少有人能透徹的分析每種方法的原理和過程,(當(dāng)然,要想透徹的分析這些原理和過程,需要研究底層的東西,如page 生命周期和page原理,反射,IIS如何解析請求等,CLR,GC,反編譯等)。
大致概括一下,ASP.NET 頁面之間傳遞值得方式大致可以分為如下幾種:Request.QueryString["name"],Request.Form("name"),Session,Cookie,Cache,Application,Server.Transfer,Database,HttpContext的Item屬性,F(xiàn)iles,DataBase等等。
詳解每種方法
一、Request.QueryString
核心代碼:
protected void getQueryString_Click(object sender, EventArgs e) { string QueStr = Request.QueryString["name"]; Response.Write(QueStr); }
總結(jié):
1、Request.QueryString:獲取http查詢字符串變量集合。有兩重載,即Request.QueryString[string name]和Request.QueryString[int index];
2、Request.QueryString主要是獲取url中的“?”之后的參數(shù),如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); }
總結(jié):
1、Request.Form 獲取窗體變量集合。有兩重載,即Request.Form[string name]和Requst.Form[int index]。
2、獲取表單指定名字的參數(shù)值。
三、Session
1、Session基本操作
a、創(chuàng)建Session
//創(chuàng)建Session public void createSession(string[] arrStr) { //創(chuàng)建數(shù)組 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();
c、遍歷Session
//遍歷Session public void getSession() { IEnumerator sessionEnum = Session.Keys.GetEnumerator(); while (sessionEnum.MoveNext()) { Response.Write(Session[sessionEnum.Current.ToString()].ToString()+";"); } }
d、清空Session,但不結(jié)束會話
//清空Session,但不結(jié)束會話 public void clearSession() { Session.Clear(); }
e、結(jié)束Session會話
//結(jié)束Session會話 public void abandonSession() { Session.Abandon(); }
2、Session數(shù)據(jù)存放形式和位置
<system.web> <sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" stateNetworkTimeout="number of seconds"/> </system.web>
注解:
mode:表示設(shè)置存儲Session形式和位置;
a、Off:禁用Session;
b、Inproc:In Process縮寫,表示將Session存儲在IIS進程內(nèi),但注意,該種方式雖然性能高,但IIS重啟是,丟失Session信息;(默認(rèn)值)
c、SateServer:將Session存儲在ASP.NET狀態(tài)服務(wù)進程中(重新啟動Web運用程序時保留會話狀態(tài),并使會話狀態(tài)可以用于網(wǎng)絡(luò)中的多個Web服務(wù)器);
d、將Session存儲在SQL Server中
cookieless:設(shè)置客戶端存儲Session形式和位置
a、true:使用cookieless模式,這時客戶端的Session信息就不再使用Cookie存儲了,而是將其通過URL存儲;
b、false:使用kookie模式,默認(rèn)值。
timeout 設(shè)置經(jīng)過多少分鐘后服務(wù)器自動放棄Session信息。默認(rèn)為20分鐘;
stateConnectionString 設(shè)置將Session信息存儲在狀態(tài)服務(wù)中時使用的服務(wù)器名稱和端口號,例如:"tcpip=127.0.0.1:42424”。當(dāng)mode的值是StateServer是,這個屬性是必需的。(默認(rèn)端口42424);
sqlConnectionString 設(shè)置與SQL Server連接時的連接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=joye"。當(dāng)mode的值是SQLServer時,這個屬性是必需的;
stateNetworkTimeout 設(shè)置當(dāng)使用StateServer模式存儲Session狀態(tài)時,經(jīng)過多少秒空閑后,斷開Web服務(wù)器與存儲狀態(tài)信息的服務(wù)器的TCP/IP連接的。默認(rèn)值是10秒鐘;
3、Session原理
為什么引入Session?大家知道,因為http是一種無狀態(tài)協(xié)議,因此,Session正彌補了這一缺陷。當(dāng)然,Session作用遠(yuǎn)遠(yuǎn)不止于這些,這里就不多論述。
Session在ASP.NET中,表示客戶端(Goggle,Firefox,IE等)與服務(wù)器端的會話,用來存儲特定會話信息,準(zhǔn)確來說,是用來存儲特定用戶信息。當(dāng)客戶端向服務(wù)器發(fā)送一個請求時,如登陸用戶ID,服務(wù)器接收到該請求,服務(wù)器端Session產(chǎn)生一個與該登陸用戶相關(guān)的SessionID,并將SessioID返回給客戶端(Goggle,Firefox,IE等),在新會話開始時,服務(wù)器將SessionID當(dāng)做cookie存儲在用戶的瀏覽器中。
總結(jié):
1、定義:System.Web.SessionState.HttpSessionState Page.Session //獲取ASP.NET提供的當(dāng)前Session對象。
2、特性:
a、Session中文意思為“會話”,在ASP.NET中,表示客戶端和服務(wù)器之間的會話,web中常用會話之一。
b、Session存儲在服務(wù)器端內(nèi)存中。
c、Session可以存儲任何類型的數(shù)據(jù),包括自定義對象。
d、Session與Session間是相互獨立的,互不干擾。
e、Session與Cookie配對使用,Session在服務(wù)器端產(chǎn)生SessionID,并將該SessionID返回給客戶端(IE,FireFox,Google等),客戶端Cookie來存儲該SessionID,整過會話過程中,只要保存SessionID的Cookie不丟失,則Session的信息就不會丟失。
f、Session保存的數(shù)據(jù)可以跨頁訪問,即跨頁面是全局的。
g、Session不能跨進程訪問,只能由該會話用戶訪問。
h、可以在不結(jié)束會話的條件下,清除Session信息,即調(diào)用Session.Clear();
i、當(dāng)會話結(jié)束,過期,服務(wù)器就會清除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(); }
總結(jié):
1、Application對象的作用范圍是整個全局,也就是說對所有用戶都有效。它在整個應(yīng)用程序生命周期中都是有效的,類似于使用全局變量一樣,所以可以在不同頁面中對它進行存取。它和Session變量的區(qū)別在于,前者是所有的用戶共用的全局變量,后者是各個用戶獨有的全局變量??赡苡腥藭?,既然所有用戶都可以使用application變量,那他可以用在什么場合呢?這里舉個例子:網(wǎng)站訪問數(shù)。多個請求訪問時都可以對它進行操作。
2、優(yōu)點:使用簡單,消耗較少的服務(wù)器資源;不僅能傳遞簡單數(shù)據(jù),還能傳遞對象;數(shù)據(jù)量大小是不限制的。
3、缺點:作為全局變量容易被誤操作。所以單個用戶使用的變量一般不能用application。
4、在源頁面的代碼中創(chuàng)建你需要傳遞的名稱和值構(gòu)造Application變量:Application["name"]="Value(Or Object)";在目的頁面的代碼使用Application變量取出傳遞的值。Result = Application["name"]。
5、常用lock和unlock方法用來鎖定和解鎖,為了防止并發(fā)修改。
五、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));
總結(jié):
1、應(yīng)用程序中的緩存機制用于將需要大量服務(wù)器資源來創(chuàng)建的對象存儲在內(nèi)存中,以此大大改進應(yīng)用程序的性能。這個機制同樣可以用來傳值。
2、與其他方法不同的是,該方法需要設(shè)置緩存項優(yōu)先級和緩存時間。因為當(dāng)系統(tǒng)內(nèi)存缺乏時,緩存機制會自動移除很少使用或優(yōu)先級較低的項,從而造成傳值失敗。
3、該方法的優(yōu)點是傳遞數(shù)據(jù)的大小和數(shù)量無限制,速度快。缺點是緩存機制的操作相對比較復(fù)雜。
六、Cookie
核心代碼:
//Class1 HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie"); Response.Redirect("~/Class2.aspx"); //Class2 Label1.Text = Request.Cookies["testCookie"].Value;
總結(jié):
1、Cookie用于在用戶瀏覽器上存儲小塊的信息,保存用戶的相關(guān)信息,比如用戶訪問某網(wǎng)站時用戶的ID,用戶的偏好等,用戶下次訪問就可以通過檢索獲得以前的信息。所以Cookie也可以在頁面間傳遞值。
2、Cookie通過HTTP頭在瀏覽器和服務(wù)器之間來回傳遞的。Cookie只能包含字符串的值,如果想在Cookie存儲整數(shù)值,那么需要先轉(zhuǎn)換為字符串的形式。
3、與Session一樣,其是什對每一個用戶而言的,但是有個本質(zhì)的區(qū)別,即Cookie是存放在客戶端的,而session是存放在服務(wù)器端的。而且Cookie的使用要配合ASP.NET內(nèi)置對象Request來使用。
4、使用簡單,是保持用戶狀態(tài)的一種非常常用的方法。比如在購物網(wǎng)站中用戶跨多個頁面表單時可以用它來保持用戶狀態(tài)。
5、常常被人認(rèn)為用來收集用戶隱私而遭到批評。
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 對象包含與當(dāng)前頁面相關(guān)的信息,提供對整個上下文的訪問,包括請求、響應(yīng)、以及上文中的Session 和Application 等信息。
2、可以使用此對象在網(wǎng)頁之間共享信息,從而實現(xiàn)頁面間的傳值。
3、與使用 Form 的方法類似,該方法也能保持大量的數(shù)據(jù),缺點也相同,但使用方法相對比較簡單。
八、ViewState
核心代碼:
//Class1 ViewState["id"]=TextBox1.Text; //數(shù)據(jù)保存 Label1.Text=ViewState["id"].ToString(); //數(shù)據(jù)取出 ViewState.Remove("id"); //數(shù)據(jù)移除
總結(jié):
1、ViewState 是ASP.NET 用來在同一頁面的多個請求之間保存和還原服務(wù)器控件視圖狀態(tài)的一種機制。與傳統(tǒng)的“同一頁面”不同,ASP.NET 中“同一頁面”的每一個請求都會導(dǎo)致服務(wù)器重新生成該頁面,但是新生成的頁面并不包含原來頁面的數(shù)據(jù)。(頁面無狀態(tài)性)
2、ViewState 的任務(wù)就是保存原來頁面中服務(wù)器控件視圖狀態(tài)的數(shù)據(jù)供新頁面使用。從這個意義上講,ViewState 也可以看作是一種在頁面間傳遞數(shù)據(jù)的工具。
3、ViewState 的工作原理是:作為一個隱藏的窗體字段在客戶端和服務(wù)器之間傳遞,可見,濫用ViewState 會加重頁面回傳的負(fù)擔(dān),從而降低應(yīng)用程序的性能。
此外,ViewState 也能被控件、頁面和應(yīng)用程序禁用。
九、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"];
總結(jié):
1、每個Web運用程序繼承web.config文件和machine.config文件的設(shè)置。
2、web.config和machine.config這兩種文件保存數(shù)據(jù)一般都很小,多為明文,特別適合保存一些字符串常量,如數(shù)據(jù)庫連接信息。此外,web.config文件是可以擴展的,因此,也可以用來傳遞變量。由于這兩種文件會被自動緩存,所以不存在因磁盤IO產(chǎn)生的性能瓶頸等問題。要注意的是文件中某些設(shè)置會導(dǎo)致文件被修改后Web運用程序的重啟。
3、web.config:你可以向單個Web運用程序運用設(shè)置。例如,你可能會希望設(shè)置特定的驗證方法、調(diào)試的類型、默認(rèn)語言或自定義的錯誤頁面。但如果你要使用這些設(shè)置,必須把web.config文件放到web運用程序的根虛擬目錄下。要想在Web運用程序中進一步配置自己的子目錄,需要 在這些文件夾中放置附加的web.config。(關(guān)于ASP.NET web.config文件詳細(xì)介紹,可參考我另外一篇博客:ASP.NET web.config)
4、machine.config:從c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目錄中的一個叫macine.config的文件開始 配置。machine.config文件定義支持的配置文件節(jié),配置ASP.NET工作者進程,注冊可用于高級特性(如配置文件、成員資格以及基于角色的安全等)提供程序。(關(guān)于ASP.NET machine.config文件的詳細(xì)介紹,我之后會寫一篇文章來介紹)
十、Static
核心代碼:
//class1 public static string userName;//在class1中定義靜態(tài)全局變量 userName=txtBoxUserName.Text; Response.Redirect("~/class2.aspx"); //class2 Label1.Text=Src.id;
總結(jié):
1、這個應(yīng)該是非常容易理解的,在ASP.NET中,每個頁面對應(yīng)一個具體的類,既然如此,那么頁面之間的傳遞,我們就可以歸結(jié)為:類與類之間數(shù)據(jù)的傳遞。想到這一步,問題應(yīng)該就迎刃而解了, 因為我們可以利用類之間的公關(guān)靜態(tài)變量來解決這個問題。
2、若合理利用,可以有效地提高數(shù)據(jù)傳遞效率,但若濫用,可能會導(dǎo)致用戶或頁面間數(shù)據(jù)紊亂,存在一定風(fēng)險和隱患,應(yīng)謹(jǐn)慎使用。
提出以下問題:大家可以分析一下,以下代碼有什么問題?
//Class1 protected void btnRedirect_Click(object sender, EventArgs e) { string userName = txtBoxUserName.Text; Response.Redirect("~/Class2.aspx"); } //Class2 Lable1.Text=userName;
十一、補充常用頁面之間跳轉(zhuǎn)
1.最常用的頁面跳轉(zhuǎn)(原窗口被替代):Response.Redirect("XXX.aspx");
2.利用url地址打開本地網(wǎng)頁或互聯(lián)網(wǎng):Respose.Write("<script language='javascript'>window.open('"+ url+"');</script>");
3.原窗口保留再新打開另一個頁面(瀏覽器可能阻止,需要解除):Response.Write("<script>window.open('XXX.aspx','_blank')</script>");
4.效果同1中的另一種寫法:Response.Write("<script>window.location='XXX.aspx'</script>");
5.也是原窗口被替代的 (常用于傳遞session變量的頁面跳轉(zhuǎn)):Server.Transfer("XXX.aspx");
6.原窗口保留,以對話框形式打開新窗口:Response.Write("<script>window.showModelessDialog('XXX.aspx')</script>");
7.對話框形式打開新窗口,原窗口被代替:Response.Write("<script>window.showModelDialog('XXX.aspx')</script>");
8.打開簡潔窗口:Respose.Write("<script language='javascript'>window.open('"+url+"','','resizable=1,scrollbars=0,status=1,menubar=no,toolbar=no,location=no, menu=no');</script>");
9.利用vs2008端口:System.Diagnostics.Process.Start(http://localhost:3210/系統(tǒng)管理員.aspx);
注釋:比較簡單,我這里就不論述了。
總結(jié):
關(guān)于頁面之間傳值,還有很多方法,如文件傳值、數(shù)據(jù)庫傳值,ViewBag等等,在這里就不一一論述了。若以后有時間,將會在此基礎(chǔ)上補充,并逐步完善該篇博文。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Entity?Framework代碼優(yōu)先Code?First入門
這篇文章介紹了Entity?Framework的代碼優(yōu)先模式Code?First,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06MVC默認(rèn)路由實現(xiàn)分頁(PagerExtend.dll下載)
這篇文章主要介紹了MVC默認(rèn)路由實現(xiàn)分頁,采用bootstrap的樣式,文末提供了PagerExtend.dll下載地址,感興趣的小伙伴們可以參考一下2016-07-07自定義 DataList 顯示數(shù)據(jù)行數(shù)的方法
自定義 DataList 顯示數(shù)據(jù)行數(shù)的方法,需要的朋友可以參考一下2013-03-03dz asp.net論壇中函數(shù)--根據(jù)Url獲得源文件內(nèi)容
從asp.net dz論壇發(fā)現(xiàn)的這個函數(shù),學(xué)習(xí)一下高手的經(jīng)驗代碼2008-09-09.NET 8 中如何利用 MediatR 實現(xiàn)高效消息傳遞
這篇文章主要介紹了.NET 8 中利用 MediatR 實現(xiàn)高效消息傳遞,示例不僅說明了如何使用MediatR?來處理通知,還說明了如何實現(xiàn)通知處理模式,需要的朋友可以參考下2024-08-08一天精通asp.net的學(xué)習(xí)經(jīng)驗小結(jié)
一天精通asp.net的學(xué)習(xí)經(jīng)驗小結(jié)2010-02-02ASP.NET Core中實現(xiàn)用戶登錄驗證的最低配置示例代碼
最近工作中遇到一個需求,需要在ASP.NET Core中來實現(xiàn)一個基礎(chǔ)的身份認(rèn)證,下面這篇文章主要給大家介紹了關(guān)于ASP.NET Core中實現(xiàn)用戶登錄驗證的最低配置的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10Asp.net回調(diào)技術(shù)Callback學(xué)習(xí)筆記
這篇文章主要記錄了Asp.net回調(diào)技術(shù)Callback的一些知識,感興趣的朋友可以參考下2014-08-08