介紹: 在網(wǎng)頁(yè)應(yīng)用程序的開發(fā)中,頁(yè)面之間的傳值應(yīng)該是最常見的問題了。 在這篇文章里,azamsharp 將為我們介紹一些ASP.NET頁(yè)面?zhèn)髦档姆绞?。本文所舉的例子非常簡(jiǎn)單,僅僅包含了一個(gè)文本框和幾個(gè)按鈕,當(dāng)按鈕點(diǎn)擊時(shí)文本框中的字符串將會(huì)以不同的方 式傳遞到另外的頁(yè)面去。 1. Response.Redirect (或稱 Query String 方式、URL方式) Response.Redirect("WebForm5.aspx"); 首先讓我們看看 Response.Redirect 方法,這應(yīng)該是最簡(jiǎn)單的了,當(dāng)我們點(diǎn)擊Response.Redirect按鈕后觸發(fā)上面的那行代碼即可。在這里跟大家分享一個(gè)小技巧:有些時(shí)候我們會(huì)把 上面的代碼放在try{ ... }catch() 中去,也就是說當(dāng)我們捕獲異常,并把異常傳遞給另一個(gè)網(wǎng)頁(yè)。如果我們嘗試這樣做,也許會(huì)得到一個(gè)“System.Threading” 異常,這是因?yàn)槲覀兲D(zhuǎn)到了另外一個(gè)頁(yè)面,而原來的頁(yè)面線程仍然在運(yùn)行中。可以這樣來解決此問題: Response.Redirect("WebForm5.aspx",false); 這意味著告訴編譯器去“WebForm5.aspx”, 同時(shí)“false”參數(shù)告訴編譯器不要停止在原來頁(yè)面上的活動(dòng), 這方面我們可以參見System.Threading類。 在下面的代碼中,“txtName”是待傳值的文本框的名字,那個(gè)跟在“?”后面的“Name” 是一個(gè)臨時(shí)response變量的標(biāo)志,它承載了txtName的值。 privatevoidButton1_Click(objectsender,System.EventArgse) { //ValuesentusingHttpResponse Response.Redirect("WebForm5.aspx?Name="+txtName.Text); } OK,到此位置,我們已經(jīng)完成了Response的傳值。但是,我們?cè)?WebForm5.aspx"中怎樣接收傳來的值呢?不要急,我們將 在"WebForm5.aspx"的page_Load事件中寫下面的代碼。首先,我們要確認(rèn)傳來的值不是“null”,如果不是“null”,我們就可 以用Label將這個(gè)值顯示出來。 注:當(dāng)我們使用Response.Redirect傳遞變量時(shí),所有的變量都能在瀏覽器的URL中看到,我們不能用這種方法來傳遞重要的機(jī)密數(shù)據(jù),如信用卡號(hào)等。 if(Request.QueryString["Name"]!=null) Label3.Text=Request.QueryString["Name"]; 2. Cookies 方式 接下來是用cookies, Cookies由服務(wù)端創(chuàng)建,但保存在客戶端,當(dāng)我們點(diǎn)擊“Cookies”按鈕時(shí),運(yùn)行如下代碼: HttpCookiecName=newHttpCookie("Name"); cName.Value=txtName.Text; Response.Cookies.Add(cName); Response.Redirect("WebForm5.aspx"); 首先,我們創(chuàng)建了一個(gè)名叫“cName”的cookie實(shí)例,由于一個(gè)cookie實(shí)例可以保存多個(gè)值,我們需要告訴編譯器這個(gè)cookie將保存 “Name”值,并把txtName.Text的值賦給它,并把它加到"輸出流” 中,并使用Response.Redirect輸出到另外一個(gè)網(wǎng)頁(yè)。 然后讓我們看看怎樣在目標(biāo)頁(yè)面中取出這個(gè)cookie中的值: if(Request.Cookies["Name"]!=null) Label3.Text=Request.Cookies["Name"].Value; 顯然,步驟跟上一種方法非常相似,只是使用Request.Cookies代替了Request.QueryString。 注:一些瀏覽器是不支持Cookies的。 3. Session 變量 接下來我們看看在服務(wù)端維持的Session變量。 Session在用戶向服務(wù)端發(fā)出首次請(qǐng)求時(shí)被創(chuàng)建,而在用戶關(guān)閉瀏覽器或異常發(fā)生時(shí)終止(其實(shí)還有過期的情況)。下面的代碼是用Session來傳值的 例子。 我們可以看到 Session 為用戶創(chuàng)建了“Name” 鍵,并把TextBox的值賦給它。 Code //Session創(chuàng)建 Session["Name"]=txtName.Text; Response.Redirect("WebForm5.aspx"); //下面的代碼顯示如何從Session中取值 //代碼放在其它頁(yè)面中 if(Session["Name"]!=null) Label3.Text=Session["Name"].ToString(); 4. Application 變量 有些時(shí)候,我們需要一個(gè)值能夠在所有的頁(yè)面中訪問,這時(shí)候我們可以使用Application變量。 如下列代碼所示,一旦我們創(chuàng)建了Application變量并賦值,就可以在網(wǎng)站(項(xiàng)目)的所有頁(yè)面中獲得它。 Code //為Application變量賦值 Application["Name"]=txtName.Text; Response.Redirect("WebForm5.aspx"); //從Application變量中取出值 if(Application["Name"]!=null) Label3.Text=Application["Name"].ToString(); 5. Server.Transfer方式(或稱HttpContext方式) 我們還可以使用 Server.Transfer方式(或稱HttpContext方式)在頁(yè)面之間傳遞變量,此時(shí),要傳遞的變量可以通過屬性或方法來獲得,使用屬性將會(huì)比較容易一些。好,讓我們?cè)诘谝粋€(gè)頁(yè)面中來寫一個(gè)用來獲得TextBox值的屬性: Code publicstringGetName { get{returntxtName.Text;} } 我們需要使用Server.Transfer把這個(gè)值發(fā)送到另外一個(gè)頁(yè)面中去,請(qǐng)注意Server.Transfer只是發(fā)送控件到一個(gè)新的頁(yè)面去,而并不會(huì)使瀏覽器重定向到另一個(gè)頁(yè)面。所以,我們我們?cè)诘刂窓谥腥匀豢吹降氖窃瓉眄?yè)面的URL。如下代碼所示: Server.Transfer("WebForm5.aspx"); 接下來,我們到"WebForm5.aspx"看看: Code //YoucandeclarethisGloballyorinanyeventyoulike WebForm4w; //GetsthePage.ContextwhichisAssociatedwiththispage w=(WebForm4)Context.Handler; //AssigntheLabelcontrolwiththeproperty"GetName"whichreturnsstring Label3.Text=w.GetName; 結(jié)束語(yǔ): 如我們看到的那樣,各種傳值方式都各有優(yōu)劣,在不同的情況下選擇適當(dāng)?shù)姆绞绞呛苤匾摹?/div> |
聯(lián)系客服