轉(zhuǎn)載自:.net 頁(yè)面?zhèn)鲄⒎绞娇偨Y(jié)
ASP.NET為我們提供了三種方式,一種是可以通過(guò)用QueryString來(lái)傳送相應(yīng)的值,再一種是通過(guò)session變量來(lái)傳送相應(yīng)的值,還有就是 通過(guò)Server.Transfer方法來(lái)實(shí)現(xiàn)。下面分別一一介紹:
一、使用Querystring
Querystring是一種非常簡(jiǎn)單的傳值方式,其缺點(diǎn)就是:安全性低。會(huì)把要傳送的值顯示在瀏覽器的地址欄中(也就是不需要保密得參數(shù)),并且在此方法中不能夠傳遞對(duì)象,參數(shù)的長(zhǎng)度不能大于 1024字節(jié)(?),當(dāng)參數(shù)中有中文得時(shí)候,通常需要使用HttpUlitity.UrlEncode方法來(lái)對(duì)參數(shù)進(jìn)行編碼和解碼。
優(yōu)點(diǎn):速度快。如果你想傳遞一個(gè)安全性不是那么太重要或者是一個(gè)簡(jiǎn)單的數(shù)值時(shí),用此方法最好不過(guò)了。下面通過(guò)一個(gè)小例子來(lái)完成傳值工作,步驟如下:
1、創(chuàng)建一個(gè)web form
2、在新建的web form中放置一個(gè)button1,在放置兩個(gè)TextBox1,TextBox2
3、為button按鈕創(chuàng)建click事件
代碼如下:
privatevoidButton1_Click
(objectsender, System.EventArgs e)
{
stringurl;
url="webform2.aspx?name="+
TextBox1.Text+"&email="+
TextBox2.Text;
Response.Redirect(url);
}
4、新建一個(gè)目標(biāo)頁(yè)面命名為webform2
5、在webform2中放置兩個(gè)Label1,Label2
在webform2的Page_Load中添加如下代碼:
privatevoidPage_Load
(objectsender, System.EventArgs e)
{
Label1.Text=Request.QueryString["name"];
Label2.Text=Request.QueryString["email"];
}
運(yùn)行,即可看到傳遞后的結(jié)果了。
二、使用Session變量
使用Session變量傳值是一種最常見(jiàn)的方式了,此中方式不僅可以把值傳遞到下一個(gè)頁(yè)面,還可以交叉?zhèn)鬟f到多個(gè)頁(yè)面,直至把Session變量的值removed后,變量才會(huì)消失。舉個(gè)例子看看:
1、創(chuàng)建一個(gè)web form
2、在新建的web form中放置一個(gè)button1,在放置兩個(gè)TextBox1,TextBox2
3、為button按鈕創(chuàng)建click事件
代碼如下:
privatevoidButton1_Click
(objectsender, System.EventArgs e)
{
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Response.Redirect("webform2.aspx");
}
4、新建一個(gè)目標(biāo)頁(yè)面命名為webform2
5、在webform2中放置兩個(gè)Label1,Label2
在webform2的Page_Load中添加如下代碼:
privatevoidPage_Load
(objectsender, System.EventArgs e)
{
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
}
運(yùn)行,即可看到傳遞后的結(jié)果了。
這種方法得優(yōu)缺點(diǎn)是:使用Session變量往往會(huì)占用服務(wù)器端的內(nèi)存使用,所以再網(wǎng)頁(yè)流量很大的時(shí)候,Session便不能很好的完成傳值得任務(wù),由于session有一個(gè)timeout,所以在使用的時(shí)候?qū)τ脩?hù)得操作也有一定的影響。
三、使用Server.Transfer
雖然這種方法有點(diǎn)復(fù)雜,但也不失為一種在頁(yè)面?zhèn)髦档姆绞?。使用該方法你可以在另一個(gè)頁(yè)面以對(duì)象屬性的方式來(lái)存取顯露的值,當(dāng)然了,使用這種方法,你需要額外寫(xiě)一些代碼以創(chuàng)建一些屬性以便可以在另一個(gè)頁(yè)面訪(fǎng)問(wèn)它,但是,這個(gè)方式帶來(lái)的好處也是顯而易見(jiàn)的.
舉個(gè)例子看看:
1、創(chuàng)建一個(gè)web form
2、在新建的web form中放置一個(gè)button1,在放置兩個(gè)TextBox1,TextBox2
3、為button按鈕創(chuàng)建click事件
代碼如下:
privatevoidButton1_Click
(objectsender, System.EventArgs e)
{
Server.Transfer("webform2.aspx");
}
4、創(chuàng)建過(guò)程來(lái)返回TextBox1,TextBox2控件的值代碼如下:
publicstringName
{
get
{
returnTextBox1.Text;
}
}
publicstringEMail
{
get
{
returnTextBox2.Text;
}
}
5、新建一個(gè)目標(biāo)頁(yè)面命名為webform2
6、在webform2中放置兩個(gè)Label1,Label2
在webform2的Page_Load中添加如下代碼:
privatevoidPage_Load
(objectsender, System.EventArgs e)
{
//創(chuàng)建原始窗體的實(shí)例
WebForm1 wf1;
//獲得實(shí)例化的句柄
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;
}
運(yùn)行,即可看到傳遞后的結(jié)果了。
這種方法 優(yōu)缺點(diǎn)是:需要寫(xiě)一些額外的代碼創(chuàng)建一些屬性,但是它簡(jiǎn)潔清晰,并且是面向?qū)ο蟮摹?/p>
四、Application
因?yàn)閼?yīng)用程序和它存儲(chǔ)的所有對(duì)象可以同時(shí)由不同的線(xiàn)程訪(fǎng)問(wèn),所以最好只將很少修改的數(shù)據(jù)與應(yīng)用程序范圍一起存儲(chǔ)。理想情況是,對(duì)象在 Application_Start 事件中初始化,對(duì)它的進(jìn)一步訪(fǎng)問(wèn)是只讀的。
在下面的示例中,文件在 Application_Start(在 Global.asax 文件中定義)中讀取,內(nèi)容則以應(yīng)用程序狀態(tài)存儲(chǔ)在 DataView 對(duì)象中。
voidApplication_Start()
{
DataSet ds=newDataSet();
FileStream fs=newFileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);
StreamReader reader=newStreamReader(fs);
ds.ReadXml(reader);
fs.Close();
DataView view=newDataView(ds.Tables[0]);
Application["Source"]=view;
}
在 Page_Load 方法中,DataView 隨后被檢索并用于填充 DataGrid 對(duì)象:
voidPage_Load(Object sender, EventArgs e)
{
DataView Source=(DataView)(Application["Source"]);
MyDataGrid.DataSource=Source;
}
此解決方案的優(yōu)點(diǎn)是只有第一個(gè)請(qǐng)求付出檢索數(shù)據(jù)的代價(jià)。所有后面的請(qǐng)求則使用已有的 DataView 對(duì)象。由于數(shù)據(jù)自初始化后從不修改,所以不必為序列化訪(fǎng)問(wèn)做任何規(guī)定。
Application得使用一般是相對(duì)于整個(gè)項(xiàng)目來(lái)說(shuō)相對(duì)靜止的變量,比如數(shù)據(jù)庫(kù)連接變量等。對(duì)于那些針對(duì)每一個(gè)用戶(hù),每一個(gè)會(huì)話(huà)未必一樣得變量就不適用了。通常Application變量得值是在Config終指定。也可以在global.ascx中指定。
五、Cookie:
下面的示例說(shuō)明如何使用客戶(hù)端 Cookie 存儲(chǔ)易失的用戶(hù)首選項(xiàng)。
在客戶(hù)端存儲(chǔ) Cookie 是 ASP.NET 的會(huì)話(huà)狀態(tài)將請(qǐng)求與會(huì)話(huà)關(guān)聯(lián)的方法之一。Cookie 也可以直接用于在請(qǐng)求之間保持?jǐn)?shù)據(jù),但數(shù)據(jù)隨后將存儲(chǔ)在客戶(hù)端并隨每個(gè)請(qǐng)求一起發(fā)送到服務(wù)器。瀏覽器對(duì) Cookie 的大小有限制,因此,只有不超過(guò) 4096 字節(jié)才能保證被接受。
當(dāng)數(shù)據(jù)存儲(chǔ)在客戶(hù)端時(shí),文件 cookies1.aspx 中的 Page_Load 方法檢查客戶(hù)端是否已發(fā)送了 Cookie。如果沒(méi)有,則創(chuàng)建并初始化一個(gè)新的 Cookie 并將其存儲(chǔ)在客戶(hù)端:
protectedvoidPage_Load(Object sender, EventArgs e)
{
if(Request.Cookies["preferences1"]==null)
{
HttpCookie cookie=newHttpCookie("preferences1");
cookie.Values.Add"ForeColor","black");
Response.AppendCookie(cookie);
}
}
在同一頁(yè)上,再次使用 GetStyle 方法提供存儲(chǔ)在 Cookie 中的個(gè)別值:
protectedString GetStyle(String key)
{
HttpCookie cookie=Request.Cookies["preferences1"];
if(cookie!=null)
{
switch(key)
{
case"ForeColor":
returncookie.Values["ForeColor"];
break;
}
}
return"";
}
若要使 Cookie 在會(huì)話(huà)之間持久,必須將 HttpCookie 類(lèi)上的 Expires 屬性設(shè)置為將來(lái)的某個(gè)日期。除了 Cookie.Expires 的賦值,下列自定義 .aspx 頁(yè)上的代碼與上一個(gè)示例相同:
protectedvoidSubmit_Click(Object sender, EventArgs e)
{
HttpCookie cookie=newHttpCookie("preferences2");
cookie.Values.Add("ForeColor",ForeColor.Value);
cookie.Expires=DateTime.MaxValue;//Never Expires
Response.AppendCookie(cookie);
Response.Redirect(State["Referer"].ToString());
}
Cookie作為一種提交,請(qǐng)求時(shí)保存數(shù)據(jù)得方式,又很明顯的優(yōu)缺點(diǎn)。他的缺點(diǎn)在上面有所表述,比如大小受限,不能保存對(duì)象等,另外,作為保存時(shí)間,也就 是數(shù)據(jù)得有效期來(lái)說(shuō),確是保存得最好的。我們可以通過(guò)設(shè)置cookie得過(guò)期時(shí)間等屬性來(lái)設(shè)置。Cookie又很多常用屬性,包括domain,path 等,這些資料可以在quickstart上獲取到。
六、ViewState:
ASP.NET 為每個(gè)控件提供視圖狀態(tài)的服務(wù)器端注記??丶梢允褂妙?lèi) StateBag 的一個(gè)實(shí)例上的 ViewState 屬性,在請(qǐng)求之間保存它的內(nèi)部狀態(tài)。StateBag 類(lèi)提供詞典樣式的接口來(lái)存儲(chǔ)與字符串鍵關(guān)聯(lián)的對(duì)象。
文件 pagestate1.aspx 顯示一個(gè)可見(jiàn)的面板并使用鍵 PanelIndex 在該頁(yè)的視圖狀態(tài)下存儲(chǔ)它的索引:
protectedvoidNext_Click(Object sender, EventArgs e )
{
String PrevPanelId="Panel"+ViewState["PanelIndex"].ToString();
ViewState["PanelIndex"]=(int)ViewState["PanelIndex"]+1;
String PanelId="Panel"+ViewState["PanelIndex"].ToString();
}
注意,如果在多個(gè)瀏覽器窗口中打開(kāi)該頁(yè),每個(gè)瀏覽器窗口最初將顯示此名稱(chēng)面板。每個(gè)窗口可以獨(dú)立地在面板之間定位。
小結(jié)
1. 使用應(yīng)用程序狀態(tài)變量存儲(chǔ)很少修改但經(jīng)常使用的數(shù)據(jù)。
2. 使用會(huì)話(huà)狀態(tài)變量存儲(chǔ)特定于某個(gè)會(huì)話(huà)或用戶(hù)的數(shù)據(jù)。數(shù)據(jù)全部存儲(chǔ)在服務(wù)器上。這種方法適于短期的、大量的或敏感的數(shù)據(jù)。
3. 將少量易失數(shù)據(jù)存儲(chǔ)在非持久性 Cookie 中。數(shù)據(jù)存儲(chǔ)在客戶(hù)端,在每次請(qǐng)求時(shí)發(fā)送到服務(wù)器,并在客戶(hù)端結(jié)束執(zhí)行時(shí)失效。
4. 將少量非易失數(shù)據(jù)存儲(chǔ)在持久性 Cookie 中。數(shù)據(jù)存儲(chǔ)在客戶(hù)端直到失效,并在每次請(qǐng)求時(shí)發(fā)送到服務(wù)器。
5. 將少量請(qǐng)求特定的數(shù)據(jù)存儲(chǔ)在視圖狀態(tài)中。數(shù)據(jù)從服務(wù)器發(fā)送到客戶(hù)端并返回。