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

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

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

  session對象所定義的變量只是瀏覽器端的專用變量,所以適用于局部會話間的網(wǎng)頁數(shù)據(jù)傳遞。

(2)使用Cookie
  cookie是在瀏覽頁面時Web服務(wù)器在瀏覽器端所寫入的一些小文件,cookie是存放在瀏覽器端本機(jī)磁盤上,而不是存放在服務(wù)端的??梢栽诎l(fā)送數(shù)據(jù)時寫入cookie,接收時讀取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對象是用來記錄整個網(wǎng)站信息的,是記錄不同瀏覽器端共享的變量,無論有幾個瀏覽者同時存取網(wǎng)頁,都只會產(chǎn)生一個application對象實例。用戶可以通過定義application整站共享變量來實現(xiàn)網(wǎng)頁間的數(shù)據(jù)傳遞。其定義方法是:application(“變量名”)=數(shù)值

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

  application對象所定義的變量對于所有瀏覽端都是可見的,所以其使用場合是所有瀏覽端共享的全局?jǐn)?shù)據(jù)傳遞。 

(4)使用URL地址中的參數(shù)
        URL方式是實現(xiàn)Web間數(shù)據(jù)傳遞最基本的方法,操作簡單,可很方便地實現(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對象來獲取傳遞的數(shù)據(jù)。如:request(“username”)。這種方法在傳遞數(shù)據(jù)過程中其數(shù)據(jù)內(nèi)容在URL欄中是顯示的,用戶能看到提交的內(nèi)容。 

        以上四種方法的適用范圍:簡單變量如基本的數(shù)據(jù)類型的數(shù)據(jù)

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

  如:

  發(fā)送頁面:

<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");
}

  接收頁面:request(“UserID”)

  利用form頁面的文本框來接收用戶數(shù)據(jù)的輸入,通過submit按鈕提交后在targetweb頁面中使用request來接收數(shù)據(jù)。 

        適用范圍:基本的數(shù)據(jù)類型的數(shù)據(jù),不宜傳遞對象變量等復(fù)雜的數(shù)據(jù)

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

        此方法的適用范圍:簡單變量如基本的數(shù)據(jù)類型的數(shù)據(jù),復(fù)雜變量如結(jié)構(gòu)、類變量、DataSet、DataTable等

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

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

        這里下載源代碼

        希望大家能補(bǔ)充