在WEB環(huán)境中頁(yè)面之間的數(shù)據(jù)傳遞可以通過(guò)傳統(tǒng)的URL參數(shù)傳遞和會(huì)話級(jí)傳遞以及通過(guò)ASP.NET服務(wù)器控件傳遞頁(yè)面值。
1使用Querystring Querystring是一種非常簡(jiǎn)單的傳遞參數(shù)的方式,其缺點(diǎn)就是會(huì)把要傳送的值顯示在瀏覽器的地址欄中(不安全),同時(shí)在使用querystring傳值得時(shí)候不能傳遞對(duì)象,參數(shù)的長(zhǎng)度不能大于1024字節(jié),當(dāng)參數(shù)中有中文得時(shí)候,通常需要使用HttpUlitity.UrlEncode方法來(lái)對(duì)參數(shù)進(jìn)行編碼和解嗎。當(dāng)然如果你想傳遞一個(gè)安全性不是那么太重要或者是一個(gè)簡(jiǎn)單的數(shù)值時(shí),用此方法最好不過(guò)了。下面通過(guò)一個(gè)小例子來(lái)完成參數(shù)傳遞過(guò)程 a.aspx的C#代碼 private void Button1_Click(ob { string s_url; s_url = "b.aspx?name=" + Label1.Text; Response.Redirect(s_url); } b.aspx中C#代碼 private void Page_Load(ob { Label2.Text = Request.QueryString["name"]; } 2.使用Application傳遞參數(shù) 使用Application變量傳遞參數(shù)是一種最常見的方法,Application對(duì)象的作用范圍是整個(gè)全局,也就是說(shuō)對(duì)所有用戶都有效。其常用的方法用Lock和UnLock。但是缺點(diǎn)在于使用Application得使用一般是相對(duì)于整個(gè)項(xiàng)目來(lái)說(shuō)相對(duì)靜止的變量,比如數(shù)據(jù)庫(kù)連接變量等。對(duì)于那些針對(duì)每一個(gè)用戶,每一個(gè)會(huì)話未必一樣得變量就不適用了。通常Application變量得值是在Config終指定。也可以在global.ascx中指定。例如: a.aspx的C#代碼 private void Button1_Click(ob { Application["name"] = Label1.Text; Server.Transfer("b.aspx"); } b.aspx中C#代碼 private void Page_Load(ob { string name; Application.Lock(); name = Application["name"].ToString(); Application.UnLock(); } 3使用Session變量 使用Session變量傳值是一種最常見的方式了,優(yōu)點(diǎn)此種方式不僅可以把值傳遞到下一個(gè)頁(yè)面,還可以交叉?zhèn)鬟f到多個(gè)頁(yè)面,直至把Session變量的值removed后,變量才會(huì)消失。但是使用Session變量往往會(huì)占用服務(wù)器端的內(nèi)存使用,所以再網(wǎng)頁(yè)流量很大的時(shí)候,Session便不能很好的完成傳值得任務(wù),由于session有一個(gè)timeout,所以在使用的時(shí)候?qū)τ脩舻貌僮饕灿幸欢ǖ挠绊?。例如?/SPAN> 創(chuàng)建一個(gè)web form 在新建的web form中放置一個(gè)button1,在放置兩個(gè)TextBox1TextBox2 為button按鈕創(chuàng)建click事件代碼如下: private void Button1_Click(ob { Session["name"]=TextBox1.Text; Session["email"]=TextBox2.Text; Response.Redirect("webform2.aspx"); } 新建一個(gè)目標(biāo)頁(yè)面命名為webform2在webform2中放置兩個(gè)Label1Label2在webform2的Page_Load中添加如下代碼: private void Page_Load(ob { Label1.Text=Session["name"].ToString(); Label2.Text=Session["email"].ToString(); Session.Remove("name"); Session.Remove("email"); } 運(yùn)行即可看到傳遞后的結(jié)果了。 4使用cookie方法傳遞參數(shù) 這個(gè)也是大家常使用的方法,cookie是瀏覽器端的文本文件,通過(guò)對(duì)它的讀、寫,可以很方便的實(shí)現(xiàn)頁(yè)面間的與Session一樣,其是針對(duì)每一個(gè)用戶而言的,但是有個(gè)本質(zhì)的區(qū)別,即Cookie是存放在客戶端的,而session是存放在服務(wù)器端的。而且Cookie的使用要配合ASP.NET內(nèi)置對(duì)象Request來(lái)使用。cookie是瀏覽器端的文本文件,通過(guò)對(duì)它的讀、寫,可以很方便的實(shí)現(xiàn)頁(yè)面間的參數(shù)傳遞,而且作為保存時(shí)間,也就是數(shù)據(jù)得有效期來(lái)說(shuō),確是保存得最好的。但是其缺點(diǎn)是安全性較差,大小受限,不能保存對(duì)象。例如: a.aspx的C#代碼 private void Button1_Click(ob { HttpCookie cookie_name = new HttpCookie("name"); cookie_name.Value = Label1.Text; Reponse.AppendCookie(cookie_name); Server.Transfer("b.aspx"); } b.aspx中C#代碼 private void Page_Load(ob { string name; name = Request.Cookie["name"].Value.ToString(); } 5 使用Server.Transfer方法 這個(gè)可以說(shuō)是面象對(duì)象開發(fā)所使用的方法,其使用Server.Transfer方法把流程從當(dāng)前頁(yè)面引導(dǎo)到另一個(gè)頁(yè)面中,新的頁(yè)面使用前一個(gè)頁(yè)面的應(yīng)答流,所以這個(gè)方法是完全面象對(duì)象的,簡(jiǎn)潔有效。它在服務(wù)器端直接重定向效率高。而且它可以傳遞上一個(gè)頁(yè)面的提交值。比如:A頁(yè)面提交值到B頁(yè)面,B頁(yè)面Transfer到C頁(yè)面,C頁(yè)面同樣可以收到A頁(yè)面提交的值。但是它的缺點(diǎn)在于不能刷新頁(yè)面,比如:A頁(yè)面提交登錄信息到B頁(yè)面,B頁(yè)面處理后Transfer再到A,A頁(yè)面得不到刷新,指定了過(guò)期也不行。如果A、B頁(yè)面不在同一個(gè)目錄下,我們還會(huì)發(fā)現(xiàn)更多意想不到的結(jié)果,使用相對(duì)鏈接的圖片、超鏈接的指向都改變了,造成這種原因是B頁(yè)面讀取A頁(yè)面內(nèi)容卻以B頁(yè)面的身份輸出,所以路徑改變了。例如: a.aspx的C#代碼 public string Name { get{ return Label1.Text;} } private void Button1_Click(ob { Server.Transfer("b.aspx"); } b.aspx中C#代碼 private void Page_Load(ob { a newWeb; //實(shí)例a窗體 newWeb = (source)Context.Handler; string name; name = newWeb.Name; } 以上五種在Web頁(yè)面之間傳遞值的方法它們各有其優(yōu)缺點(diǎn)我們通過(guò)他們的優(yōu)缺點(diǎn)比較發(fā)現(xiàn)它們各自的特點(diǎn)。因而使用它們時(shí)要根據(jù)具體的實(shí)際情況選擇使用那一種方法不可一概而論。 |
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇