不管什么時(shí)候,總能看到網(wǎng)上有人在問(wèn)頁(yè)面之間怎么傳遞變量,針對這一情況,我想把所有能想到的傳遞變量的方法匯總一下,然后再介紹各種方法的使用范圍,供大家參考,也希望大家在此給點(diǎn)建議,來(lái)幫助后來(lái)或剛開(kāi)始學(xué).net的朋友。
        我總共就總結了這么幾種方法:
(1)Session
(2)Cookie
(3)Application
(4)URL地址中的參數
(5)通過(guò)隱藏字段來(lái)傳遞數據
(6)Server.Transfer
(7)通過(guò)序列化對象
(8)........

下面就分別一一介紹:
(1)使用Session
        session對象是用來(lái)記錄瀏覽器端的變量,是個(gè)別瀏覽器端專(zhuān)用的變量,對于每一個(gè)瀏覽器訪(fǎng)問(wèn)時(shí)都會(huì )自動(dòng)產(chǎn)生一個(gè)seseion對象,該對象提供一個(gè)存儲場(chǎng)所,用來(lái)存儲僅僅對該訪(fǎng)問(wèn)者在會(huì )話(huà)的活動(dòng)期間打開(kāi)的網(wǎng)頁(yè)可用的變量和對象。這樣就用可以用來(lái)在Web間傳遞專(zhuān)對單個(gè)瀏覽器端使用的數據。其定義方法:session(“變量名”)=數值

  如:Session["testTransmitVaraint"] = "testSession";

  session對象所定義的變量只是瀏覽器端的專(zhuān)用變量,所以適用于局部會(huì )話(huà)間的網(wǎng)頁(yè)數據傳遞。

(2)使用Cookie
  cookie是在瀏覽頁(yè)面時(shí)Web服務(wù)器在瀏覽器端所寫(xiě)入的一些小文件,cookie是存放在瀏覽器端本機磁盤(pán)上,而不是存放在服務(wù)端的??梢栽诎l(fā)送數據時(shí)寫(xiě)入cookie,接收時(shí)讀取cookie完成數據在Web頁(yè)面間的傳送。

發(fā)送頁(yè)面
HttpCookie cookie = new HttpCookie("testCookie");
cookie.Value = TextBox1.Text;
Response.SetCookie(cookie);

取Cookie頁(yè)
HttpCookie cookie = Request.Cookies["testCookie"];
Response.Write("<br>HttpCookie = " + cookie.Value);

(3)使用Application
        application對象是用來(lái)記錄整個(gè)網(wǎng)站信息的,是記錄不同瀏覽器端共享的變量,無(wú)論有幾個(gè)瀏覽者同時(shí)存取網(wǎng)頁(yè),都只會(huì )產(chǎn)生一個(gè)application對象實(shí)例。用戶(hù)可以通過(guò)定義application整站共享變量來(lái)實(shí)現網(wǎng)頁(yè)間的數據傳遞。其定義方法是:application(“變量名”)=數值

  如:Application["testApplication"] = "testApplication";

  application對象所定義的變量對于所有瀏覽端都是可見(jiàn)的,所以其使用場(chǎng)合是所有瀏覽端共享的全局數據傳遞。 

(4)使用URL地址中的參數
        URL方式是實(shí)現Web間數據傳遞最基本的方法,操作簡(jiǎn)單,可很方便地實(shí)現不同Web頁(yè)面間的數據傳遞,但其安全性比較差。將要傳遞的數據附加在網(wǎng)頁(yè)地址(URL)后面進(jìn)行傳遞。如:http://192.168.0.1/testweb.aspx?username=liming,其中?后面所跟著(zhù)的字符串便是傳遞的數據,=前的是變量名,=后面是數值,可以使用request對象來(lái)獲取傳遞的數據。如:request(“username”)。這種方法在傳遞數據過(guò)程中其數據內容在URL欄中是顯示的,用戶(hù)能看到提交的內容。 

        以上四種方法的適用范圍:簡(jiǎn)單變量如基本的數據類(lèi)型的數據

(5)使用隱藏字段來(lái)傳遞數據
  通過(guò)在網(wǎng)頁(yè)上制作表單交互區域,用戶(hù)在瀏覽器端輸入數據,然后通過(guò)form提交到服務(wù)器,在提交后的接受form數據的頁(yè)面里就可以接收到相應數據,即form的action頁(yè)面中可以使用request對象來(lái)接收所傳遞的數據。

  如:

  發(fā)送頁(yè)面:

<body MS_POSITIONING="GridLayout">
    
<form id="Form1" method="post" runat="server">
        
<table border="0" align="center" width="100%">
            
<tr>
                
<td align="center"><input type="hidden" name="UserID" value="測試隱藏字段"></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文件中添加下面的代碼:

private void Button1_Click(object sender, System.EventArgs e)
{
    Server.Transfer(
"RequestHidden.aspx");
}

  接收頁(yè)面:request(“UserID”)

  利用form頁(yè)面的文本框來(lái)接收用戶(hù)數據的輸入,通過(guò)submit按鈕提交后在targetweb頁(yè)面中使用request來(lái)接收數據。 

        適用范圍:基本的數據類(lèi)型的數據,不宜傳遞對象變量等復雜的數據

(6)使用Server.Transfer
        這個(gè)方法稍微復雜一點(diǎn),但在頁(yè)面間值傳遞中卻是特別有用的,使用該方法你可以在另一個(gè)頁(yè)面以對象屬性的方式來(lái)存取顯露的值,當然了,使用這種方法,你需要額外寫(xiě)一些代碼以創(chuàng )建一些屬性以便可以在另一個(gè)頁(yè)面訪(fǎng)問(wèn)它,但是,這個(gè)方式帶來(lái)的好處也是顯而易見(jiàn)的??傮w來(lái)說(shuō),使用這種方法是簡(jiǎn)潔的同時(shí)又是面向對象的。
        使用這種方法的整個(gè)過(guò)程如下:
1,在頁(yè)面里添加必要的控件
2,創(chuàng )建返回值的Get屬性過(guò)程
3,創(chuàng )建可以返回表單的按鈕和鏈接按鈕
4,在按鈕單擊事件處理程序中調用Server.Transfer方法轉移到指定的頁(yè)面
5,在第二個(gè)頁(yè)面中,我們就可以使用Context.Handler屬性來(lái)獲得前一個(gè)頁(yè)面實(shí)例對象的引用,通過(guò)它,就可以使用存取前一個(gè)頁(yè)面的控件的值了
        此方法的適用范圍:簡(jiǎn)單變量如基本的數據類(lèi)型的數據,復雜變量如結構、類(lèi)變量、DataSet、DataTable等
        具體的事例,請見(jiàn)原代碼。  

        此方法的適用范圍:簡(jiǎn)單變量如基本的數據類(lèi)型的數據,復雜變量如結構、類(lèi)變量、DataSet、DataTable等

(7)通過(guò)序列化對象
        序列化是指將對象實(shí)例的狀態(tài)存儲到存儲媒體的過(guò)程。在此過(guò)程中,先將對象的公共字段和私有字段以及類(lèi)的名稱(chēng)(包括類(lèi)所在的程序集)轉換為字節流,然后再把字節流寫(xiě)入數據流。在隨后對對象進(jìn)行反序列化時(shí),將創(chuàng )建出與原對象完全相同的副本。
        在面向對象的環(huán)境中實(shí)現序列化機制時(shí),必須在易用性和靈活性之間進(jìn)行一些權衡。只要您對此過(guò)程有足夠的控制能力,就可以使該過(guò)程在很大程度上自動(dòng)進(jìn)行。例如,簡(jiǎn)單的二進(jìn)制序列化不能滿(mǎn)足需要,或者,由于特定原因需要確定類(lèi)中那些字段需要序列化。
        為什么要使用序列化?最重要的兩個(gè)原因是:將對象的狀態(tài)保存在存儲媒體中以便可以在以后重新創(chuàng )建出完全相同的副本;按值將對象從一個(gè)應用程序域發(fā)送至另一個(gè)應用程序域。例如,序列化可用于在A(yíng)SP.NET 中保存會(huì )話(huà)狀態(tài),以及將對象復制到 Windows 窗體的剪貼板中。它還可用于按值將對象從一個(gè)應用程序域遠程傳遞至另一個(gè)應用程序域。
        關(guān)于序列化對象更詳細的介紹,請參見(jiàn)微軟的“.NET 中的對象序列化” 

(8)結束語(yǔ)
  上述介紹的是網(wǎng)頁(yè)間數據傳遞的常用方法,各有千秋。其中URL方式和form方式實(shí)現方法簡(jiǎn)單,可實(shí)現網(wǎng)頁(yè)間的簡(jiǎn)單數據傳遞,一般為字符串類(lèi)型,其特點(diǎn)是安全性差,而且必須是連續訪(fǎng)問(wèn)兩頁(yè)面間數據傳遞。Cookie只能存放string類(lèi)型的數據,如果想要存放更為復雜的數據類(lèi)型,那么必須先將其轉換為string類(lèi)型。Application對象和Session對象操作相對復雜些,瀏覽量非常大的網(wǎng)頁(yè)使用時(shí)應適量,而且使用結束后盡量清除,否則大量使用有可能會(huì )導致服務(wù)器的癱瘓。Session變量的安全性較高,可傳遞專(zhuān)用瀏覽端數據。具體應用決定了數據傳遞方式的選擇,合理數據傳遞方式選擇是Web頁(yè)面的設計中的關(guān)鍵考慮因素。

        這里下載源代碼

        希望大家能補充