不管什么時(shí)候,總能看到網(wǎng)上有人在問頁面之間怎么傳遞變量,針對(duì)這一情況,我想把所有能想到的傳遞變量的方法匯總一下,然后再介紹各種方法的使用范圍,供大家參考,也希望大家在此給點(diǎn)建議,來幫助后來或剛開始學(xué).net的朋友。
我總共就總結(jié)了這么幾種方法:
(1)Session
(2)Cookie
(3)Application
(4)URL地址中的參數(shù)
(5)通過隱藏字段來傳遞數(shù)據(jù)
(6)Server.Transfer
(7)通過序列化對(duì)象
(8)........
下面就分別一一介紹:
(1)使用Session
session對(duì)象是用來記錄瀏覽器端的變量,是個(gè)別瀏覽器端專用的變量,對(duì)于每一個(gè)瀏覽器訪問時(shí)都會(huì)自動(dòng)產(chǎn)生一個(gè)seseion對(duì)象,該對(duì)象提供一個(gè)存儲(chǔ)場(chǎng)所,用來存儲(chǔ)僅僅對(duì)該訪問者在會(huì)話的活動(dòng)期間打開的網(wǎng)頁可用的變量和對(duì)象。這樣就用可以用來在Web間傳遞專對(duì)單個(gè)瀏覽器端使用的數(shù)據(jù)。其定義方法:session(“變量名”)=數(shù)值
如:Session["testTransmitVaraint"] = "testSession";
session對(duì)象所定義的變量只是瀏覽器端的專用變量,所以適用于局部會(huì)話間的網(wǎng)頁數(shù)據(jù)傳遞。
(2)使用Cookie
cookie是在瀏覽頁面時(shí)Web服務(wù)器在瀏覽器端所寫入的一些小文件,cookie是存放在瀏覽器端本機(jī)磁盤上,而不是存放在服務(wù)端的。可以在發(fā)送數(shù)據(jù)時(shí)寫入cookie,接收時(shí)讀取cookie完成數(shù)據(jù)在Web頁面間的傳送。
發(fā)送頁面
HttpCookie cookie = new HttpCookie("testCookie");
cookie.Value = TextBox1.Text;
Response.SetCookie(cookie);
取Cookie頁
HttpCookie cookie = Request.Cookies["testCookie"];
Response.Write("<br>HttpCookie = " + cookie.Value);
(3)使用Application
application對(duì)象是用來記錄整個(gè)網(wǎng)站信息的,是記錄不同瀏覽器端共享的變量,無論有幾個(gè)瀏覽者同時(shí)存取網(wǎng)頁,都只會(huì)產(chǎn)生一個(gè)application對(duì)象實(shí)例。用戶可以通過定義application整站共享變量來實(shí)現(xiàn)網(wǎng)頁間的數(shù)據(jù)傳遞。其定義方法是:application(“變量名”)=數(shù)值
如:Application["testApplication"] = "testApplication";
application對(duì)象所定義的變量對(duì)于所有瀏覽端都是可見的,所以其使用場(chǎng)合是所有瀏覽端共享的全局?jǐn)?shù)據(jù)傳遞。
(4)使用URL地址中的參數(shù)
URL方式是實(shí)現(xiàn)Web間數(shù)據(jù)傳遞最基本的方法,操作簡(jiǎn)單,可很方便地實(shí)現(xiàn)不同Web頁面間的數(shù)據(jù)傳遞,但其安全性比較差。將要傳遞的數(shù)據(jù)附加在網(wǎng)頁地址(URL)后面進(jìn)行傳遞。如:http://192.168.0.1/testweb.aspx?username=liming,其中?后面所跟著的字符串便是傳遞的數(shù)據(jù),=前的是變量名,=后面是數(shù)值,可以使用request對(duì)象來獲取傳遞的數(shù)據(jù)。如:request(“username”)。這種方法在傳遞數(shù)據(jù)過程中其數(shù)據(jù)內(nèi)容在URL欄中是顯示的,用戶能看到提交的內(nèi)容。
以上四種方法的適用范圍:簡(jiǎn)單變量如基本的數(shù)據(jù)類型的數(shù)據(jù)
(5)使用隱藏字段來傳遞數(shù)據(jù)
通過在網(wǎng)頁上制作表單交互區(qū)域,用戶在瀏覽器端輸入數(shù)據(jù),然后通過form提交到服務(wù)器,在提交后的接受form數(shù)據(jù)的頁面里就可以接收到相應(yīng)數(shù)據(jù),即form的action頁面中可以使用request對(duì)象來接收所傳遞的數(shù)據(jù)。
如:
發(fā)送頁面:
<form id="Form1" method="post" runat="server">
<table border="0" align="center" width="100%">
<tr>
<td align="center"><input type="hidden" name="UserID" value="測(cè)試隱藏字段"></td>
</tr>
<tr>
<td align="center">
<asp:Button id="Button1" runat="server" Text="ServerButton Goto Page"></asp:Button></td>
</tr>
<tr>
<td align="center"></td>
</tr>
</table>
</form>
</body>
然后在cs文件中添加下面的代碼:
{
Server.Transfer("RequestHidden.aspx");
}
接收頁面:request(“UserID”)
利用form頁面的文本框來接收用戶數(shù)據(jù)的輸入,通過submit按鈕提交后在targetweb頁面中使用request來接收數(shù)據(jù)。
適用范圍:基本的數(shù)據(jù)類型的數(shù)據(jù),不宜傳遞對(duì)象變量等復(fù)雜的數(shù)據(jù)
(6)使用Server.Transfer
這個(gè)方法稍微復(fù)雜一點(diǎn),但在頁面間值傳遞中卻是特別有用的,使用該方法你可以在另一個(gè)頁面以對(duì)象屬性的方式來存取顯露的值,當(dāng)然了,使用這種方法,你需要額外寫一些代碼以創(chuàng)建一些屬性以便可以在另一個(gè)頁面訪問它,但是,這個(gè)方式帶來的好處也是顯而易見的??傮w來說,使用這種方法是簡(jiǎn)潔的同時(shí)又是面向?qū)ο蟮摹?
使用這種方法的整個(gè)過程如下:
1,在頁面里添加必要的控件
2,創(chuàng)建返回值的Get屬性過程
3,創(chuàng)建可以返回表單的按鈕和鏈接按鈕
4,在按鈕單擊事件處理程序中調(diào)用Server.Transfer方法轉(zhuǎn)移到指定的頁面
5,在第二個(gè)頁面中,我們就可以使用Context.Handler屬性來獲得前一個(gè)頁面實(shí)例對(duì)象的引用,通過它,就可以使用存取前一個(gè)頁面的控件的值了
此方法的適用范圍:簡(jiǎn)單變量如基本的數(shù)據(jù)類型的數(shù)據(jù),復(fù)雜變量如結(jié)構(gòu)、類變量、DataSet、DataTable等
具體的事例,請(qǐng)見原代碼。
此方法的適用范圍:簡(jiǎn)單變量如基本的數(shù)據(jù)類型的數(shù)據(jù),復(fù)雜變量如結(jié)構(gòu)、類變量、DataSet、DataTable等
(7)通過序列化對(duì)象
序列化是指將對(duì)象實(shí)例的狀態(tài)存儲(chǔ)到存儲(chǔ)媒體的過程。在此過程中,先將對(duì)象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉(zhuǎn)換為字節(jié)流,然后再把字節(jié)流寫入數(shù)據(jù)流。在隨后對(duì)對(duì)象進(jìn)行反序列化時(shí),將創(chuàng)建出與原對(duì)象完全相同的副本。
在面向?qū)ο蟮沫h(huán)境中實(shí)現(xiàn)序列化機(jī)制時(shí),必須在易用性和靈活性之間進(jìn)行一些權(quán)衡。只要您對(duì)此過程有足夠的控制能力,就可以使該過程在很大程度上自動(dòng)進(jìn)行。例如,簡(jiǎn)單的二進(jìn)制序列化不能滿足需要,或者,由于特定原因需要確定類中那些字段需要序列化。
為什么要使用序列化?最重要的兩個(gè)原因是:將對(duì)象的狀態(tài)保存在存儲(chǔ)媒體中以便可以在以后重新創(chuàng)建出完全相同的副本;按值將對(duì)象從一個(gè)應(yīng)用程序域發(fā)送至另一個(gè)應(yīng)用程序域。例如,序列化可用于在ASP.NET 中保存會(huì)話狀態(tài),以及將對(duì)象復(fù)制到 Windows 窗體的剪貼板中。它還可用于按值將對(duì)象從一個(gè)應(yīng)用程序域遠(yuǎn)程傳遞至另一個(gè)應(yīng)用程序域。
關(guān)于序列化對(duì)象更詳細(xì)的介紹,請(qǐng)參見微軟的“.NET 中的對(duì)象序列化”
(8)結(jié)束語
上述介紹的是網(wǎng)頁間數(shù)據(jù)傳遞的常用方法,各有千秋。其中URL方式和form方式實(shí)現(xiàn)方法簡(jiǎn)單,可實(shí)現(xiàn)網(wǎng)頁間的簡(jiǎn)單數(shù)據(jù)傳遞,一般為字符串類型,其特點(diǎn)是安全性差,而且必須是連續(xù)訪問兩頁面間數(shù)據(jù)傳遞。Cookie只能存放string類型的數(shù)據(jù),如果想要存放更為復(fù)雜的數(shù)據(jù)類型,那么必須先將其轉(zhuǎn)換為string類型。Application對(duì)象和Session對(duì)象操作相對(duì)復(fù)雜些,瀏覽量非常大的網(wǎng)頁使用時(shí)應(yīng)適量,而且使用結(jié)束后盡量清除,否則大量使用有可能會(huì)導(dǎo)致服務(wù)器的癱瘓。Session變量的安全性較高,可傳遞專用瀏覽端數(shù)據(jù)。具體應(yīng)用決定了數(shù)據(jù)傳遞方式的選擇,合理數(shù)據(jù)傳遞方式選擇是Web頁面的設(shè)計(jì)中的關(guān)鍵考慮因素。
這里下載源代碼
希望大家能補(bǔ)充