謝生鋒
摘要:頁面間傳值是Web應用程序開發(fā)經(jīng)常用到的功能,由于ASP.NET封裝了一些內(nèi)置對象,因此實現(xiàn)頁面間傳值的方式有多種。該文分析了URL、Session對象、Application對象和Cookie對象等傳值技術,通過實例給出這些傳值方式的基本應用,并討論和比較它們的優(yōu)缺點及應用范圍。
關鍵詞:ASP.NET;頁面;傳值;變量
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)17-0072-03
The Discussion of Value-passing Technology Between Pages Based on ASP.NET
XIE Sheng-feng
(Computer Department, Henan Mechanical and Electrical Engineering College, Xinxiang 453000, China )
Abstract: Value-passing between pages is often used in web application development, because ASP.Net encapsulate some built-in objects. Therefore, the way of achieving Value-passing between pages are many. This paper analyzes the URL, session object, application object, cookie object and cookie object of Value-passing technology, through examples, it means the value of the basic application, and discusses and compares their advantages,disadvantages and the application scope.
Key words:ASP.NET; pages; value-passing; variable
ASP.NET是微軟公司用來開發(fā)Web應用程序的一種技術平臺,而其中頁面?zhèn)髦凳茿SP.NET技術當中使用最多的功能之一,頁面?zhèn)髦捣譃轫搩?nèi)傳值和頁面間傳值,頁內(nèi)傳值主要通過ViewState對象來實現(xiàn),實現(xiàn)頁面間傳值主要通過ASP.NET中的內(nèi)置對象來實現(xiàn),其實現(xiàn)方法有多種,分別是URL傳值、Session傳值、Cookie傳值和Application傳值。本文主要深入分析這些頁面間傳值技術[1]。
1 頁面間傳值技術
ASP.NET的Web頁面間經(jīng)常需要進行數(shù)據(jù)傳值, 下面以實例研究不同的傳值方法及特點。源頁面Default1.aspx中兩個TextBox中的用戶名和郵箱的值通過單擊“登錄”按鈕傳遞到目標頁面Default2.aspx, 并在Default2.aspx 中以兩個Label標簽顯示從源頁面接收到的值。兩個頁面的運行界面如圖1和圖2和所示:
1.1 使用URL傳值
使用URL傳遞參數(shù)是最常見的頁面間傳值方式,傳遞參數(shù)的URL格式如下:
http://LinkAddress?[參數(shù)名稱]=[值]&[參數(shù)名稱]=[值]&[參數(shù)名稱]=[值]
URL傳遞參數(shù)的URL格式必須遵循下面規(guī)則:
1)URL由接收參數(shù)頁面的URL地址和參數(shù)集合兩部分組成,參數(shù)部分和接收參數(shù)頁面的URL地址之間用“?”分隔,并且“?”必須是英文里的問號。
2)參數(shù)和參數(shù)值之間以“=”連接,并且每個參數(shù)之間以“&”分隔[2]。
實現(xiàn)頁面跳轉(zhuǎn)的方法可以使用超鏈接和Response對象的Redirect方法來實現(xiàn)。由于實例中的Default1.aspx頁面屬于動態(tài)頁面,傳遞的參數(shù)值是變化的,所以在服務器端用Response對象的Redirect方法很容易實現(xiàn)。單擊“確定”按鈕對應的事件處理程序代碼如下:
protected void btnOK_Click(object sender, EventArgs e)
{
string userName = txtName.Text;
string userEmail = txtEmail.Text;
string strUrl = "Default2.aspx?name=" + userName + "&email=" + userEmail;
Response.Redirect(strUrl);
}
當執(zhí)行URL傳遞參數(shù)后,接收參數(shù)的頁面Default2.aspx可以使用Request對象的QueryString屬性來訪問URL參數(shù)的值,具體實現(xiàn)代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
lbName .Text ="用戶名:" +Request.QueryString["name"];
lbEmail.Text = "郵箱:" + Request.QueryString["email"];
}
通過實例可以看到,使用URL傳值很方便,但是該方法也有一些缺點:
1)傳遞參數(shù)的值只能是字符串,對數(shù)據(jù)類型有限制;
2)傳遞參數(shù)的值會在瀏覽器地址欄里被看到,這樣安全性不高;
3)傳遞參數(shù)的值如果包含漢字時,會出現(xiàn)接收到的值丟失幾個漢字或者出現(xiàn)亂碼。為了確保傳遞的漢字可以被正確接收,可以在傳值之前使用Server對象的UrlEncode方法對所傳遞的漢字進行URL編碼。接收值時,使用Server對象的UrlDecode方法對所接收的漢字進行URL解碼。
1.2 Session對象傳值
Session是用來存儲當前用戶的信息,當用戶第一次訪問Web應用程序時,服務器會自動為每個用戶創(chuàng)建一個SessionID,用以標識當前用戶的唯一身份[3]。然后根據(jù)SessionID可以獲取到當前用戶的Session對象,由于Session對象是私有的,所以每個用戶不可以訪問其他用戶的Session對象,Session對象的數(shù)據(jù)可以被同一用戶在Web應用程序的一次會話過程共享,并且數(shù)據(jù)存儲在服務器端,因此利用Session對象可以實現(xiàn)頁面間傳值,安全性也高,存儲的數(shù)據(jù)類型沒有限制。實例中Default1.aspx頁面的后臺代碼如下:
protected void btnOK_Click(object sender, EventArgs e)
{ //分別創(chuàng)建名稱為name和email的Session對象變量
Session["name"] = txtName.Text;
Session["email"] = txtEmail.Text;
Response.Redirect("Default2.aspx");
}
由于Session對象具有超時時間限制,默認超時時間是20分鐘,當Session對象超時后,Session對象保存的數(shù)據(jù)會被清空。因此在Default2.aspx頁面首先判斷Session對象中的name變量和email變量的值是否為空,具體實現(xiàn)代碼如下:
protected void Page_Load(object sender, EventArgs e)
{ if( Session["name"]!=null&&Session["email"]!=null)
{ lbName .Text ="用戶名:" + Session["name"].ToString ();
lbEmail.Text = "郵箱:" + Session["email"].ToString ();
}
}
Session對象可以存儲任意類型的參數(shù)值,并且每個用戶的Session對象是私用的,其存儲在服務器端的數(shù)據(jù)不能被其他用戶訪問,安全性較高,但是當用戶在未超時的情況下關閉瀏覽器后,Session對象仍在服務端存儲,這樣攻擊者就可能訪問服務器端的Session對象來獲取用戶的信息。因此,使用Session對象要注意用戶關閉瀏覽器時,通過腳本語言JavaScript通知服務器刪除相應的Session對象。
1.3 Application對象傳值
Application對象用于共享應用程序級信息,多個用戶共享一個Application對象。在第一個用戶請求ASP.NET文件時,將啟動應用程序并創(chuàng)建Application對象。一旦Application對象被創(chuàng)建,就可以共享和管理整個應用程序的信息[4]。在應用程序關閉之前,Application對象將一直存在。所以利用Application對象可以在不同用戶之間共享數(shù)據(jù)。對于實例來說,如果創(chuàng)建兩個Application對象變量用來存儲用戶名和郵箱信息,由于Application對象存儲的數(shù)據(jù)可以被多個用戶共享,這樣當前用戶的信息可以被其他用戶獲取到,所以Application對象在本實例中的使用是有局限性的。實例中Default1.aspx頁面的后臺代碼如下:
protected void btnOK_Click(object sender, EventArgs e)
{ //分別創(chuàng)建名稱為name和email的Application對象變量
Application["name"]= txtName.Text;
Application["email"]= txtEmail.Text;
Response.Redirect("Default2.aspx");
}
Default2.aspx頁面的后臺代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
lbName .Text ="用戶名:" + Application ["name"].ToString ();
lbEmail.Text = "郵箱:" + Application ["email"].ToString ();
}
Application對象中的數(shù)據(jù)存儲在服務器端,并且被多個用戶所共享,所以在改變Application對象變量值的時候,采用鎖定方式,改變之后再進行解鎖,供其他用戶訪問,對應的方法分別為Lock和UnLock。在ASP.NET的Web應用程序中,使用Application對象可以統(tǒng)計在線人數(shù)。
1.4 Cookie對象傳值
Cookie對象提供了一種存儲用戶特定信息的方法,當用戶訪問Web應用程序時,使用 Cookie對象存儲用戶首選項或其他信息。當該用戶再次訪問時,應用程序便可以檢索以前存儲的信息。Cookie對象在客戶端存儲基于文本形式的用戶數(shù)據(jù),這樣不同的用戶只要不在同一臺計算機上訪問同一Web應用程序,就獲取不到Cookie對象存儲的用戶數(shù)據(jù)。由于Request和Response對象都提供了一個Cookies集合,利用Response對象向客戶端存儲Cookies的信息,使用Request對象從客戶端讀取Cookies的信息。實例中Default1.aspx頁面的后臺代碼如下:
protected void btnOK_Click(object sender, EventArgs e)
{ //分別創(chuàng)建名稱為name和email的Cookies對象變量
Response.Cookies["name"].Value = txtName.Text;
Response.Cookies["email"].Value = txtEmail.Text;
Response.Redirect("Default2.aspx");
}
Default2.aspx頁面的后臺代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
lbName.Text = "用戶名:" + Request.Cookies["name"].Value;
lbEmail.Text = "郵箱:" + Request.Cookies["email"].Value;
}
使用Cookie對象實現(xiàn)頁面間傳值具有簡單、持久和不需要任何服務器資源等優(yōu)點,用戶可以通過它對登錄的客戶進行標識,防止用戶惡意攻擊網(wǎng)站。例如:在線投票時,可以使用Cookie防止用戶進行重復投票。但是存儲在客戶端安全性差,并且每個Cookie對象都有過期時間,或者瀏覽器禁止Cookie,這都會導致需要Cookie的Web應用程序出現(xiàn)問題,同時每個Cookie存儲數(shù)據(jù)的大小都有限制。
2 結束語
總之,除了本文探討的上述傳值方式,在ASP.NET中還可以使用Cache和Context對象實現(xiàn)頁面間傳值。無論何種傳值方式,都有其優(yōu)缺點。在實際應用中應具體問題具體分析,從數(shù)據(jù)的安全性、數(shù)據(jù)類型和占用服務器資源等方面來考慮,選擇合適的傳值方式,才能靈活運用這些傳值方式,更好的解決實際問題[5]。
參考文獻:
[1] 房大偉, 呂雙. ASP.NET開發(fā)實戰(zhàn)1200例[M]. 北京: 清華大學出版社, 2011.
[2] 洪石丹. ASP.NET范例開發(fā)大全[M]. 北京: 清華大學出版社, 2010.
[3] 邵珠貴, 楊惠英. 關于ASP.NET網(wǎng)頁間數(shù)據(jù)共享的研究[J]. 吉林廣播電視大學學報, 2012(1).
[4] 王艷娟. 淺析ASP.NET頁面間傳值的幾種方式[J]. 黑龍江科技信息, 2012(11).
[5] 范明虎, 樊紅. ASP.NET頁面間傳值綜述[J]. 計算機工程, 2009(22).