摘要:使用ASP.NET開發Web應用,網頁間經常需要數據共享,通過實例討論了幾種數據傳遞和共享模式,包括最常見的使用QueryString和Server.Transfer傳參,以及使用Server控件、Applicaton對象、Session對象、Cookie對象、文件file和數據庫達到數據共享,并對其作了分析比較總結,在應用時應根據實際情況采用不同的方案。
關鍵詞:ASP.NET;數據共享;Server控件;傳值
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2009)25-7129-03
Asp.Net Inter-page Data Sharing Methods Discussion
JIA Zong-xing, ZHANG Li
(Shanxi Agricultural University Modern Educational Technology College, Taigu 030801,China)
Abstract: Web page usually needs data sharing frequently, when we use ASP.NET to develop the Web application. The paper discussed several patterns of data transfer and data sharing through the examples, including most common QueryString and Server.Transfer., as well as uses Server controls、Application、Session、Cookie、File and Database achieved data sharing, and made the analysis comparison to it to summarize, when application should act according to the actual situation to use the different plan.
Key words: ASP.NET; data sharing; server control; data transfer
Asp.Net是繼Asp之后,微軟提出的用于創建動態網頁的一種強大的服務器端技術。而動態網頁間的數據共享問題一直是建立Web網站中的主要技術和安全隱患。除了可使用最常見的QueryString和Server.Tranfer進行數據傳遞[1]ASP.NET中可以通過Web服務器控件、Application、Session、Cookie、文件file來共享數據,為用戶數據共享提供了多種選擇。下面就各種數據共享方式進行舉例分析比較。
1 數據共享方式分析比較
我們在制作Web網站時,會使用多個網頁來完成特定的工作,這樣的話,這些網頁間的數據傳遞及共享是不可避免的。ASP.NET為我們提供了幾種方式: QueryString、Server.Transfer方法、Server控件、Application、Session、Cookice、File對象和數據庫來實現。下面分別一一介紹。
2 使用Querystring
Querystring傳遞值是最簡單和最方便的方法,但其安全性不好。其缺點就是會把要傳送的值顯示在瀏覽器的地址欄中。另外,URL的參數傳遞只能是簡單的數據類型,如整型,字符串等,不能夠傳遞對象。如果你想傳遞一個安全性不是那么太重要或者是一個簡單的數值時,用此方法最好不過了。下面通過一個小例子來完成傳值工作,步驟如下:
1) 創建一個源頁面webform1,放置一個button1,兩個TextBox1,TextBox2
2) 為button按鈕創建click事件,代碼如下:
private void Button1_Click(object sender, System.EventArgs e)
{string url;
url=\"webform2.aspx?name=\" + TextBox1.Text + \"address=\" + TextBox2.Text;
Response.Redirect(url);
}
3) 新建一個目標頁面命名為webform2,放置兩個Label1,Label2。在webform2的Page_Load中添加代碼:
private void Page_Load(object sender, System.EventArgs e)
{Label1.Text=Request.QueryString[\"name\"];
Label2.Text=Request.QueryString[\"address \"];
}
運行,即可看到傳遞后的結果了。
這種方法的缺點是:使用明碼傳遞參數,也就是不需要保密的參數,同時在使用querystring傳值得時候不能傳遞對象,參數的長度不能大于1024字節。當參數中有中文的時候,通常需要使用HttpUlitity.UrlEncode方法來對參數進行編碼和解碼。
3 使用Server.Transfer
雖然這種方法有點復雜,但也不失為一種在頁面傳值的方式。舉個例子看看:
1) 創建一個源頁面webform1,放置一個button1,兩個TextBox1,TextBox2,
2) 為button按鈕創建click事件,代碼如下:
private void Button1_Click(object sender, System.EventArgs e)
{Server.Transfer(\"webform2.aspx\");}
3) 創建過程來返回TextBox1,TextBox2控件的值代碼如下:
public string Name
{ get
{ return TextBox1.Text; }
}
public string Address
{get
{ return TextBox2.Text; }
}
4) 新建一個目標頁面命名為webform2,放置兩個Label1,Label2,在其Page_Load中添加如下代碼:
private void Page_Load(object sender, System.EventArgs e)
{WebForm1 wf1; //創建原始窗體的實例
wf1=(WebForm1)Context.Handler; //獲得實例化的句柄
Label1.Text=wf1.Name;
Label2.Text=wf1.Address;
}
使用Querystring和Server.Transfer區別:1)切換對象不同,Querystring[2]中可以切換到任何存在的網頁,而Server.Transfer只能切換到同目錄或子目錄的.aspx網頁;2) Querystring瀏覽器地址欄所呈現的結果不同,切換到另一個網頁后,瀏覽器地址欄顯示新網址及附帶相關數據,而Server.Transfer仍然顯示舊的地址不顯示傳送的數據;3)傳送的數據量不同,Querystring只能傳送2KB以內的數據,Server.Transfer則可傳送超過2KB的數據。所以,從切換對象來看,Querystring功能比較多,但Server.Transfer具有保密功能,且傳送的數據量大。
4 其他方法
4.1 Sever控件
創建一webform頁面,頁面上放置一個TextBox,其屬性值設置為:runat=\"sever\" id=\"sData\"visible=False,再放置一個button,其屬性值設置為:Text=\"PostBack\"OnClick=\"Button_Click\"。
在其Page_Load中添加如下代碼:
private void Page_Load(object sender, System.EventArgs e)
{Int gData
gData=gData+100
sData.Text=Val(sData.Text)+100;
Respone.Write(\"gData=\" gData \"
\"
Respone.Write(\"sData=\" Val(sData.Text))
}
第一次網頁顯示的結果為:
gData=100
sData=100
在按下“PostBack”按鈕后,gData為100,sData為200。連續按幾次后,gData的值一直為100,而sData的值每按一次就增加100,結果如表1。
從上我們可看出,一般變量無法作為共享數據,而Server控件可以成為同一網頁在不同狀態下(網頁第一次被加載、按鈕被按下、事件發生時等狀態)的共享數據。
4.2 使用Application
Application[\"name\"]=\"李明\";
任意一個頁面可以這樣接收:
string str = Application[\"name\"].ToString():
使用Application變量[3]也可以實現頁面間傳遞值,Application變量在整個應用程序生命周期中都是有效的,類似于使用全局變量一樣;所以可以在不同的頁面中對它進行存取。多個請求訪問時可以共享這一個變量,均可對它進行操作,該變量可以被整個應用程序的各個頁面直接使用。其優點是使用簡單,消耗較少的服務器資源,不僅能傳遞簡單數據,還能傳遞對象,并且數據量大小是不限制的;缺點是Applicatio n變量作為全局變量容易被誤操作。
4.3 使用Session
Session[\"name\"]=\"李明\";
任意一個頁面可以這樣接收:
string str=Session[ \"name\"].ToString():Session. Remove( \"name\") ; //釋放掉該Session所占用的服務器資源
使用Session變量[4]和Applicatio n變量非常類似,與Application變量的區別是當有多個請求訪問時,每個請求有各自的Session變量,且只能對自己的該Sessio n變量進行操作,整個應用程序的各頁面直接使用這個變量來獲得用戶的基本信息。其優點是使用簡單,不僅能傳遞簡單數據類型,還能傳遞對象,不僅可以把值傳遞到下一個頁面,還可以交叉傳遞到多個頁面,直至把Session變量的值removed后,變量才會消失;缺點是使用Session變量往往會占用服務器端的內存使用,所以在網頁流量很大的時候,Session便不能很好的完成傳值得任務,由于session有一個timeout,所以在使用的時候對用戶的操作也有一定的影響。
4.4 使用Cookie
與Session一樣,作用于用戶個人,但是有個本質的區別,即Cookie是存放在客戶端的,而Session是存放在服務器端的。Cookie要配合ASP.NET內置對象Request來使用。
HttpCookie mycookie=new HttpCookie(\"name\");
mycookie.Value=\"李明\";Response. AppendCookie(mycookie);
在任意頁面讀取Cookie中存放的數據:
string str =Request.Cookies [\"name\"].Vale;
Cookie[5]作為一種提交請求時保存數據的方式,有很明顯的優缺點:瀏覽器對 Cookie 的大小有限制,只有不超過 4096 字節才能保證被接受,不能保存對象,另外,作為保存時間,也就是數據的有效期來說,卻是保存得最好的。我們可以通過設置cookie得過期時間等屬性來設置。
4.5 使用文件(File)
文件和Application類似,可供不同連接者的所有網頁共享,但其生命周期比Application對象長,Application會在IIS結束執行或關機時結束生命周期,而文件則不受此限制。方法:
使用StreamReader對象:
StreamReader sReader=New SreamReader(“文件路徑名“,Encoding.Deafault);
String S1=sReader.ReadLine(); //讀取串流的下一行數據
String S2=sReader.ReadToEnd();//讀取串流接下來的所有數據
除了上述方法外,還可使用數據庫來進行數據共享,在此我們不做詳細介紹。
5 總結
下面針對不同的情況對ASP.NET數據共享模式作一個小結,如表2所示。
1) 同一網頁:同一網頁因為發生某事件(如按下按鈕)而產生多種不同狀態的網頁,這類網頁以Server控件作為共享數據最為普遍。
2) 同一瀏覽窗口、不同網頁:若有某項工作需使用多個網頁來完成,則當使用者開啟瀏覽窗口后,會先瀏覽第一個網頁,而后隨著網頁的操作進入第二個網頁、第三個網頁……,但整個操作過程都在同一個瀏覽窗口上進行(沒有額外開啟另一個瀏覽窗口)。這類網頁所采用的共享數據可采用常用的Querystring和Server.Transfer方法,及Session對象和Cookie對象。
3) 同一部機器、不同瀏覽窗口(可能瀏覽相同或不同網頁):使用者在同一部機器上,開啟多個瀏覽器,而這些瀏覽窗口可能瀏覽相同網頁或不同網頁。這種情況可使用Cookie對象共享數據。
4) 不同機器:不同使用者在不同機器上瀏覽相同或不同的網頁。這種情況以Application對象、文件、數據庫為共享數據最為普遍。
參考文獻:
[1] 徐少華,張華偉,李浩.在ASP.NET中實現Web頁面值傳遞方法的比較[J].武漢理工大學學報:信息與管理工程版,2006, 28(6):37-40.
[2] 王國榮.ASP.NET網頁制作教程——從基本語法學起[M].武漢:華中科技大學出版社,2002.
[3] 劉永建.ASP. NET網頁間傳值方法探討[J].計算機與網絡,2008(15):169-170,174.
[4] Russ Basiura,Richard Conway.Professional ASP.NET Security ASP.NET安全性高級編程[M].王曉娜,黃開枝,譯.北京:清華大學出版社,2003.
[5] 孟永定,初探Asp.net中參數傳遞的實現方法[J].甘肅科技,2007,23(11):73-74,42.