ASP.NET 页面之间传值的几种方式
對(duì)于任何一個(gè)初學(xué)者來(lái)說(shuō),頁(yè)面之間傳值可謂是必經(jīng)之路,卻又是他們的難點(diǎn)。其實(shí),對(duì)大部分高手來(lái)說(shuō),未必不是難點(diǎn)。
回想2016年面試的將近300人中,有實(shí)習(xí)生,有應(yīng)屆畢業(yè)生,有1-3年經(jīng)驗(yàn)的,有3-5年經(jīng)驗(yàn)的,有5-10年經(jīng)驗(yàn)的,對(duì)于所有的面試者,我?guī)缀鯁?wèn)了同一道題:"請(qǐng)說(shuō)說(shuō)你所知道的頁(yè)面之間傳值的幾種形式和方法,
并闡述他們的原理和過(guò)程",關(guān)于這道題,從大家的回答來(lái)看,結(jié)果并不是很理想,從種類上來(lái)說(shuō),大部分人回答5種左右,極少部分能回答8種,沒(méi)有超過(guò)8種的,但從深度上來(lái)說(shuō),很少有人能透徹的分析每種方法
的原理和過(guò)程,(當(dāng)然,要想透徹的分析這些原理和過(guò)程,需要研究底層的東西,如page 生命周期和page原理,反射,IIS如何解析請(qǐng)求等,CLR,GC,反編譯等)。鑒于此,我今天花些時(shí)間來(lái)總結(jié)一下,方面
大家學(xué)習(xí),共同進(jìn)步!!
明:本次博客只從廣度上分析,不從深度上分析,若廣大讀者對(duì)深度上感興趣,并且有一定的需求,那么,我專門(mén)寫(xiě)一篇深度上分析的文章,與大家分享,共同學(xué)習(xí),共同進(jìn)步。
大致概括一下,ASP.NET 頁(yè)面之間傳遞值得方式大致可以分為如下幾種: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);}總結(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)建Sessionpublic 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
//遍歷Sessionpublic void getSession(){IEnumerator sessionEnum = Session.Keys.GetEnumerator();while (sessionEnum.MoveNext()){Response.Write(Session[sessionEnum.Current.ToString()].ToString()+";");}}d、清空Session,但不結(jié)束會(huì)話
//清空Session,但不結(jié)束會(huì)話public void clearSession(){Session.Clear();}e、結(jié)束Session會(huì)話
//結(jié)束Session會(huì)話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è)置存儲(chǔ)Session形式和位置;?
a、Off:禁用Session;
b、Inproc:In Process縮寫(xiě),表示將Session存儲(chǔ)在IIS進(jìn)程內(nèi),但注意,該種方式雖然性能高,但I(xiàn)IS重啟是,丟失Session信息;(默認(rèn)值)
c、SateServer:將Session存儲(chǔ)在ASP.NET狀態(tài)服務(wù)進(jìn)程中(重新啟動(dòng)Web運(yùn)用程序時(shí)保留會(huì)話狀態(tài),并使會(huì)話狀態(tài)可以用于網(wǎng)絡(luò)中的多個(gè)Web服務(wù)器);
d、將Session存儲(chǔ)在SQL Server中
cookieless:設(shè)置客戶端存儲(chǔ)Session形式和位置
a、true:使用cookieless模式,這時(shí)客戶端的Session信息就不再使用Cookie存儲(chǔ)了,而是將其通過(guò)URL存儲(chǔ);
b、false:使用kookie模式,默認(rèn)值。?
timeout 設(shè)置經(jīng)過(guò)多少分鐘后服務(wù)器自動(dòng)放棄Session信息。默認(rèn)為20分鐘;
stateConnectionString 設(shè)置將Session信息存儲(chǔ)在狀態(tài)服務(wù)中時(shí)使用的服務(wù)器名稱和端口號(hào),例如:"tcpip=127.0.0.1:42424”。當(dāng)mode的值是StateServer是,這個(gè)屬性是必需的。(默認(rèn)端口42424);
sqlConnectionString 設(shè)置與SQL Server連接時(shí)的連接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=joye"。當(dāng)mode的值是SQLServer時(shí),這個(gè)屬性是必需的;
stateNetworkTimeout 設(shè)置當(dāng)使用StateServer模式存儲(chǔ)Session狀態(tài)時(shí),經(jīng)過(guò)多少秒空閑后,斷開(kāi)Web服務(wù)器與存儲(chǔ)狀態(tài)信息的服務(wù)器的TCP/IP連接的。默認(rèn)值是10秒鐘;
3、Session原理
????? 為什么引入Session?大家知道,因?yàn)閔ttp是一種無(wú)狀態(tài)協(xié)議,因此,Session正彌補(bǔ)了這一缺陷。當(dāng)然,Session作用遠(yuǎn)遠(yuǎn)不止于這些,這里就不多論述。
????? Session在ASP.NET中,表示客戶端(Goggle,Firefox,IE等)與服務(wù)器端的會(huì)話,用來(lái)存儲(chǔ)特定會(huì)話信息,準(zhǔn)確來(lái)說(shuō),是用來(lái)存儲(chǔ)特定用戶信息。當(dāng)客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求時(shí),如登陸用戶ID,服務(wù)器接收到該請(qǐng)求,服務(wù)器端Session產(chǎn)生一個(gè)與該登陸用戶相關(guān)的SessionID,并將SessioID返回給客戶端(Goggle,Firefox,IE等),在新會(huì)話開(kāi)始時(shí),服務(wù)器將SessionID當(dāng)做cookie存儲(chǔ)在用戶的瀏覽器中。
總結(jié):
1、定義:System.Web.SessionState.HttpSessionState? Page.Session?//獲取ASP.NET提供的當(dāng)前Session對(duì)象。
2、特性:
a、Session中文意思為“會(huì)話”,在ASP.NET中,表示客戶端和服務(wù)器之間的會(huì)話,web中常用會(huì)話之一。
b、Session存儲(chǔ)在服務(wù)器端內(nèi)存中。
c、Session可以存儲(chǔ)任何類型的數(shù)據(jù),包括自定義對(duì)象。
d、Session與Session間是相互獨(dú)立的,互不干擾。
e、Session與Cookie配對(duì)使用,Session在服務(wù)器端產(chǎn)生SessionID,并將該SessionID返回給客戶端(IE,FireFox,Google等),客戶端Cookie來(lái)存儲(chǔ)該SessionID,
??? 整過(guò)會(huì)話過(guò)程中,只要保存SessionID的Cookie不丟失,則Session的信息就不會(huì)丟失。
f、Session保存的數(shù)據(jù)可以跨頁(yè)訪問(wèn),即跨頁(yè)面是全局的。
g、Session不能跨進(jìn)程訪問(wèn),只能由該會(huì)話用戶訪問(wèn)。
h、可以在不結(jié)束會(huì)話的條件下,清除Session信息,即調(diào)用Session.Clear();
i、當(dāng)會(huì)話結(jié)束,過(guò)期,服務(wù)器就會(huì)清除Session對(duì)象。
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對(duì)象的作用范圍是整個(gè)全局,也就是說(shuō)對(duì)所有用戶都有效。它在整個(gè)應(yīng)用程序生命周期中都是有效的,類似于使用全局變量一樣,所以可以在不同頁(yè)面中
對(duì)它進(jìn)行存取。它和Session變量的區(qū)別在于,前者是所有的用戶共用的全局變量,后者是各個(gè)用戶獨(dú)有的全局變量。可能有人會(huì)問(wèn),既然所有用戶都可以使用application
變量,那他可以用在什么場(chǎng)合呢?這里舉個(gè)例子:網(wǎng)站訪問(wèn)數(shù)。多個(gè)請(qǐng)求訪問(wèn)時(shí)都可以對(duì)它進(jìn)行操作。
2、優(yōu)點(diǎn):使用簡(jiǎn)單,消耗較少的服務(wù)器資源;不僅能傳遞簡(jiǎn)單數(shù)據(jù),還能傳遞對(duì)象;數(shù)據(jù)量大小是不限制的。
3、缺點(diǎn):作為全局變量容易被誤操作。所以單個(gè)用戶使用的變量一般不能用application。
4、在源頁(yè)面的代碼中創(chuàng)建你需要傳遞的名稱和值構(gòu)造Application變量:Application["name"]="Value(Or Object)";在目的頁(yè)面的代碼使用Application變量取出傳遞的值。Result = Application["name"]。
5、常用lock和unlock方法用來(lái)鎖定和解鎖,為了防止并發(fā)修改。
?
五、Cache
核心代碼:
//Class1Cache["id"] = TextBox1.Text;Response.Redirect("~/WebForm1.aspx");//Class2if (Cache["id"]!=null){Label1.Text = Cache["id"].ToString();}//移除緩存 Cache.Remove("id");//如果 Cache["id"]為空,則傳值失敗。可使用如下方法實(shí) //限期為10分鐘Cache.Insert("id",TextBox1.Text,null,Cache.NoAbsoluteExpiration,new TimeSpan(0,10,0));總結(jié):
1、應(yīng)用程序中的緩存機(jī)制用于將需要大量服務(wù)器資源來(lái)創(chuàng)建的對(duì)象存儲(chǔ)在內(nèi)存中,以此大大改進(jìn)應(yīng)用程序的性能。這個(gè)機(jī)制同樣可以用來(lái)傳值。
2、與其他方法不同的是,該方法需要設(shè)置緩存項(xiàng)優(yōu)先級(jí)和緩存時(shí)間。因?yàn)楫?dāng)系統(tǒng)內(nèi)存缺乏時(shí),緩存機(jī)制會(huì)自動(dòng)移除很少使用或優(yōu)先級(jí)較低的項(xiàng),從而造成傳值失敗。
3、該方法的優(yōu)點(diǎn)是傳遞數(shù)據(jù)的大小和數(shù)量無(wú)限制,速度快。缺點(diǎn)是緩存機(jī)制的操作相對(duì)比較復(fù)雜。
?
六、Cookie
?核心代碼:
//Class1HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie"); Response.Redirect("~/Class2.aspx"); //Class2Label1.Text = Request.Cookies["testCookie"].Value;?總結(jié):
1、Cookie用于在用戶瀏覽器上存儲(chǔ)小塊的信息,保存用戶的相關(guān)信息,比如用戶訪問(wèn)某網(wǎng)站時(shí)用戶的ID,用戶的偏好等,用戶下次訪問(wèn)就可以通過(guò)檢索
獲得以前的信息。所以Cookie也可以在頁(yè)面間傳遞值。
2、Cookie通過(guò)HTTP頭在瀏覽器和服務(wù)器之間來(lái)回傳遞的。Cookie只能包含字符串的值,如果想在Cookie存儲(chǔ)整數(shù)值,那么需要先轉(zhuǎn)換為字符串的形式。
3、與Session一樣,其是什對(duì)每一個(gè)用戶而言的,但是有個(gè)本質(zhì)的區(qū)別,即Cookie是存放在客戶端的,而session是存放在服務(wù)器端的。而且Cookie的使
用要配合ASP.NET內(nèi)置對(duì)象Request來(lái)使用。
4、使用簡(jiǎn)單,是保持用戶狀態(tài)的一種非常常用的方法。比如在購(gòu)物網(wǎng)站中用戶跨多個(gè)頁(yè)面表單時(shí)可以用它來(lái)保持用戶狀態(tài)。
5、常常被人認(rèn)為用來(lái)收集用戶隱私而遭到批評(píng)。
6、安全性不高,容易偽造。?
?
七、Context.Items["id"]
核心代碼:
//Class1Context.Items["id"]=TextBox1.Text;Server.Transfer("~/Class2.aspx");//Class2Label1.Text=Context.Items["id"].ToString();Context.Items.Remove("id"); //移除項(xiàng)
1、Context?對(duì)象包含與當(dāng)前頁(yè)面相關(guān)的信息,提供對(duì)整個(gè)上下文的訪問(wèn),包括請(qǐng)求、響應(yīng)、以及上文中的Session?和Application?等信息。
2、可以使用此對(duì)象在網(wǎng)頁(yè)之間共享信息,從而實(shí)現(xiàn)頁(yè)面間的傳值。
3、與使用?Form?的方法類似,該方法也能保持大量的數(shù)據(jù),缺點(diǎn)也相同,但使用方法相對(duì)比較簡(jiǎn)單。?
?
八、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?用來(lái)在同一頁(yè)面的多個(gè)請(qǐng)求之間保存和還原服務(wù)器控件視圖狀態(tài)的一種機(jī)制。與傳統(tǒng)的“同一頁(yè)面”不同,ASP.NET?中“同一頁(yè)面”的
每一個(gè)請(qǐng)求都會(huì)導(dǎo)致服務(wù)器重新生成該頁(yè)面,但是新生成的頁(yè)面并不包含原來(lái)頁(yè)面的數(shù)據(jù)。(頁(yè)面無(wú)狀態(tài)性)
2、ViewState?的任務(wù)就是保存原來(lái)頁(yè)面中服務(wù)器控件視圖狀態(tài)的數(shù)據(jù)供新頁(yè)面使用。從這個(gè)意義上講,ViewState?也可以看作是一種在頁(yè)面間傳遞數(shù)據(jù)的工具。
3、ViewState?的工作原理是:作為一個(gè)隱藏的窗體字段在客戶端和服務(wù)器之間傳遞,可見(jiàn),濫用ViewState?會(huì)加重頁(yè)面回傳的負(fù)擔(dān),從而降低應(yīng)用程序的性能。
此外,ViewState?也能被控件、頁(yè)面和應(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、每個(gè)Web運(yùn)用程序繼承web.config文件和machine.config文件的設(shè)置。
2、web.config和machine.config這兩種文件保存數(shù)據(jù)一般都很小,多為明文,特別適合保存一些字符串常量,如數(shù)據(jù)庫(kù)連接信息。此外,web.config文件是可以
擴(kuò)展的,因此,也可以用來(lái)傳遞變量。由于這兩種文件會(huì)被自動(dòng)緩存,所以不存在因磁盤(pán)IO產(chǎn)生的性能瓶頸等問(wèn)題。要注意的是文件中某些設(shè)置會(huì)導(dǎo)致文件被修改后
Web運(yùn)用程序的重啟。
3、web.config:你可以向單個(gè)Web運(yùn)用程序運(yùn)用設(shè)置。例如,你可能會(huì)希望設(shè)置特定的驗(yàn)證方法、調(diào)試的類型、默認(rèn)語(yǔ)言或自定義的錯(cuò)誤頁(yè)面。但如果你要使用這些
設(shè)置,必須把web.config文件放到web運(yùn)用程序的根虛擬目錄下。要想在Web運(yùn)用程序中進(jìn)一步配置自己的子目錄,需要?在這些文件夾中放置附加的web.config。
(關(guān)于ASP.NET web.config文件詳細(xì)介紹,可參考我另外一篇博客:ASP.NET web.config)
4、machine.config:從c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目錄中的一個(gè)叫macine.config的文件開(kāi)始?配置。machine.config
文件定義支持的配置文件節(jié),配置ASP.NET工作者進(jìn)程,注冊(cè)可用于高級(jí)特性(如配置文件、成員資格以及基于角色的安全等)提供程序。(關(guān)于ASP.NET machine.config
文件的詳細(xì)介紹,我之后會(huì)寫(xiě)一篇文章來(lái)介紹)??????
?
十、Static
核心代碼:
//class1 public static string userName;//在class1中定義靜態(tài)全局變量 userName=txtBoxUserName.Text; Response.Redirect("~/class2.aspx"); //class2 Label1.Text=Src.id;總結(jié):
1、這個(gè)應(yīng)該是非常容易理解的,在ASP.NET中,每個(gè)頁(yè)面對(duì)應(yīng)一個(gè)具體的類,既然如此,那么頁(yè)面之間的傳遞,我們就可以歸結(jié)為:類與類之間數(shù)據(jù)的傳遞。想到這一步,問(wèn)題應(yīng)該
就迎刃而解了, 因?yàn)槲覀兛梢岳妙愔g的公關(guān)靜態(tài)變量來(lái)解決這個(gè)問(wèn)題。
2、若合理利用,可以有效地提高數(shù)據(jù)傳遞效率,但若濫用,可能會(huì)導(dǎo)致用戶或頁(yè)面間數(shù)據(jù)紊亂,存在一定風(fēng)險(xiǎn)和隱患,應(yīng)謹(jǐn)慎使用。
???提出以下問(wèn)題:大家可以分析一下,以下代碼有什么問(wèn)題?
//Class1protected void btnRedirect_Click(object sender, EventArgs e){string userName = txtBoxUserName.Text;Response.Redirect("~/Class2.aspx");}//Class2Lable1.Text=userName;十一、補(bǔ)充常用頁(yè)面之間跳轉(zhuǎn)
1.最常用的頁(yè)面跳轉(zhuǎn)(原窗口被替代):Response.Redirect("XXX.aspx");
2.利用url地址打開(kāi)本地網(wǎng)頁(yè)或互聯(lián)網(wǎng):Respose.Write("<script language='javascript'>window.open('"+ url+"');</script>");
3.原窗口保留再新打開(kāi)另一個(gè)頁(yè)面(瀏覽器可能阻止,需要解除):Response.Write("<script>window.open('XXX.aspx','_blank')</script>");
4.效果同1中的另一種寫(xiě)法:Response.Write("<script>window.location='XXX.aspx'</script>");
5.也是原窗口被替代的 (常用于傳遞session變量的頁(yè)面跳轉(zhuǎn)):Server.Transfer("XXX.aspx");
6.原窗口保留,以對(duì)話框形式打開(kāi)新窗口:Response.Write("<script>window.showModelessDialog('XXX.aspx')</script>");
7.對(duì)話框形式打開(kāi)新窗口,原窗口被代替:Response.Write("<script>window.showModelDialog('XXX.aspx')</script>");
8.打開(kāi)簡(jiǎn)潔窗口: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ǎn)單,我這里就不論述了。
總結(jié):
關(guān)于頁(yè)面之間傳值,還有很多方法,如文件傳值、數(shù)據(jù)庫(kù)傳值,ViewBag等等,在這里就不一一論述了。若以后有時(shí)間,將會(huì)在此基礎(chǔ)上補(bǔ)充,并逐步完善該篇博文。
轉(zhuǎn)載于:https://www.cnblogs.com/zzp0320/p/7878143.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET 页面之间传值的几种方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android 微信分享图片
- 下一篇: WPF绑定资源文件错误(error in