URL、Session、Cookies、Server.Transfer、Application和跨页面传送。
URL、Session、Cookies、Server.Transfer、Application和跨頁面?zhèn)魉汀?br />【分析】
本題考查面試者對(duì)ASP.NET中多頁面?zhèn)髦档睦斫馐欠袢妗R驗(yàn)锳SP.NET的頁面表單提交到自身,完成回傳的功能,所以默認(rèn)情況下不能使用POST方式進(jìn)行多頁面?zhèn)髦怠jP(guān)于這些傳值方式的分析如下所示。
1.URL傳值
這是經(jīng)典的傳值方式,這種方法的使用非常簡(jiǎn)單,不過所傳遞的值是會(huì)顯示在瀏覽器的地址欄上的,而且不能傳遞對(duì)象。所以這種方法一般用于傳遞的值少且安全性要求不高的情況下。在*.aspx頁面開發(fā)中可以使用超級(jí)鏈接文本進(jìn)行傳值,如以下代碼所示。
<asp:HyperLink runat="server" ID="HpLink"
NavigateUrl="~/GetValues.aspx?urlvalue1=intel&urlvalue2=amd">URL傳值</asp:HyperLink>
以 上鏈接文本將頁面跳轉(zhuǎn)到GetValues.aspx頁面,并且通過URL傳遞urlvalue1變量和urlvalue2變量,其值分別為intel和 amd。在*.cs的服務(wù)器端方法中也可以調(diào)用HttpResponse對(duì)象的Redirect方法,將瀏覽器端重定向到新頁面并通過URL傳值,如以下 代碼所示。
Response.Redirect(“~/GetValues.aspx?urlvalue1=intel&urlvalue2=amd”);
2.Session傳值
這種方法將每份數(shù)據(jù)存儲(chǔ)于服務(wù)器變量中,可以傳遞比較多的數(shù)據(jù),并且安全性較高,所以常用于用戶身份的驗(yàn)證功能中。不過,Session變量如果存儲(chǔ)過多的數(shù)據(jù)會(huì)消耗過多的服務(wù)器資源,編程者在使用時(shí)應(yīng)該慎重,其使用方法如以下代碼所示。
Session["SessionValue"] = “ATI”;
//也可以用索引存儲(chǔ)
Session[0] = “ATI”;
//在其他頁面的服務(wù)器端方法中取值方式為:
string str = Session["SessionValue"].ToString();
//也可以用索引獲取
string str = Session[0].ToString();
Session的可在應(yīng)用程序的多個(gè)頁面中以名稱/值對(duì)的方式共享,直到瀏覽用戶關(guān)閉自己的瀏覽器或者服務(wù)器Session超時(shí)(可設(shè)置,默認(rèn)為20分鐘)。
3.Cookie傳值
Cookie 是一種比較特殊的數(shù)據(jù)存儲(chǔ)方式,因?yàn)檫@種方式將數(shù)據(jù)存儲(chǔ)于瀏覽用戶的電腦中,以文本文件的形式存在于磁盤中。這種方式非常有意思,很多登錄系統(tǒng)就是利用 Cookie實(shí)現(xiàn)用戶自動(dòng)登錄。即用戶登錄一次的登錄信息將被寫入到用戶電腦的Cookie文件中,下次登錄時(shí),網(wǎng)站自動(dòng)讀取該Cookie完成身份驗(yàn) 證。通過Cookie傳遞數(shù)據(jù)雖然很方便,保存時(shí)間可以自由設(shè)置,但是安全性不高,編程者不應(yīng)過于依賴Cookie,而應(yīng)采用結(jié)合的方式完成敏感數(shù)據(jù)的存 儲(chǔ)。
ASP.NET中操作Cookie的主要類型位于System.Web命名空間下,分別為HttpCookie、HttpResponse以 及HttpRequest。HttpCookie可建立和操作獨(dú)立Cookie的安全類型,訪問HttpResponse和HttpRequest的 Cookies屬性可以獲取HttpCookieCollection集合對(duì)象,以讀取或添加HttpCookie對(duì)象。添加Cookie的方法如以下代 碼所示。
//創(chuàng)建一個(gè)HttpCookie 對(duì)象,向構(gòu)造函數(shù)傳遞名稱值
HttpCookie ck = new HttpCookie("CookieValue");
//設(shè)置ck的“Value”屬性(值)
ck.Value = “Cookie值”;
//設(shè)置ck的過期時(shí)間為當(dāng)前時(shí)間加上360s,即6分鐘后失效
ck.Expires = DateTime.Now.AddSeconds(360);
//設(shè)置ck有效范圍(域限制)
ck.Domain = "www.google.cn";
//將ck添加至HttpCookieCollection對(duì)象
Response.Cookies.Add(ck);
//也可為以下方法添加
//Response.AppendCookie(ck);;
讀取用戶的Cookie則更為簡(jiǎn)單,只需根據(jù)名稱讀取HttpCookieCollection集合對(duì)象中的子項(xiàng)即可,如以下代碼所示。
string str = Request.Cookies["CookieValue"].Value;
除此之外,還可以利用一個(gè)HttpCookie存儲(chǔ)多個(gè)名稱/值對(duì)形式的Cookie信息,如以下代碼所示。
HttpCookie ck = new HttpCookie("CookieValue");
//以名稱/值對(duì)的方式添加多個(gè)Cookie信息
ck.Values.Add("value1", “one”);
ck.Values.Add("value2", "two");
//設(shè)置ck的過期時(shí)間為當(dāng)前時(shí)間加上100年,即100年后失效
ck.Expires = DateTime.Now.AddYears(100);
//通過以下兩種方法添加
Response.Cookies.Add(ck);
//Response.AppendCookie(ck);
讀取這些Cookie如以下代碼所示。
string str = "值1:"+Request.Cookies["CookieValue"].Values["value1"];
str += "值2:" + Request.Cookies["CookieValue"].Values["value2"];
說 明:多數(shù)瀏覽器支持最多可達(dá)4096字節(jié)的Cookie,如果要將為數(shù)不多的幾個(gè)值保存到用戶計(jì)算機(jī)上,瀏覽器還限制了每個(gè)站點(diǎn)可以在用戶計(jì)算機(jī)上保存的 Cookie數(shù)量。大多數(shù)瀏覽器只允許每個(gè)站點(diǎn)保存20個(gè)Cookie。如果試圖保存更多的Cookie,則最先保存的Cookie就會(huì)被刪除。還有些瀏 覽器會(huì)對(duì)來自所有站點(diǎn)的Cookie總數(shù)作出限制,這個(gè)限制通常為300個(gè)。用戶可以設(shè)置自己的瀏覽器,拒絕接受Cookie,這種情況下只能結(jié)合其他的 數(shù)據(jù)存儲(chǔ)方式。
4.Server.Transfer傳值
這個(gè)方法的步驟相對(duì)較多,使用該方法編程者可 以在另一個(gè)頁面以公開對(duì)象屬性的方式來存取值,使用這種方法是面向?qū)ο蟮摹T摲椒ǖ拇a編寫并不復(fù)雜,首先通過定義一個(gè)public權(quán)限的屬性,該屬性可 返回所需傳遞的值。然后在第兩個(gè)頁面中,使用Context.Handler屬性來獲得前一個(gè)頁面實(shí)例對(duì)象的引用,即可通過訪問自定義的屬性獲取需要的 值。
假設(shè)SendValues.aspx頁面為傳遞數(shù)據(jù)的頁面,在SendValues.aspx.cs的頁面類中定義一個(gè)public屬性,通過get直接返回需要傳遞的值(可為頁面中某個(gè)服務(wù)器控件的屬性值)。
public string TransferData
{
get
{
return "VIA";
}
}
在SendValues.aspx.cs的某個(gè)方法(如Button控件的Click事件處理方法)中調(diào)用HttpServerUtility對(duì)象的Transfer方法,如以下代碼所示。
Server.Transfer("~/GetValues.aspx");
假設(shè)GetValues.aspx為第二個(gè)頁面,在GetValues.aspx.cs的Page_Load方法中接收前一個(gè)頁面所傳遞的值,方法如以下代碼所示。
//定義SendValues類型的變量SV_Page
SendValues SV_Page;
//訪問HttpContext對(duì)象的Handler屬性,將值轉(zhuǎn)換為SendValues類型,引用賦值給SV_Page
SV_Page = (SendValues)Context.Handler;
//SV_Page即為SendValues.aspx頁面類的對(duì)象,直接獲取其TransferData屬性值
string str = SV_Page.TransferData;
可 見,這種方法對(duì)于有面向?qū)ο蠡A(chǔ)的編程者而言非常容易理解。不過頁面間如果需要傳遞數(shù)量比較多的值,這種方法需要定義過多的屬性,略顯繁雜。編程者還可以 直接使用HttpContext對(duì)象的“Iterms”屬性添加多項(xiàng)名稱/值對(duì)的數(shù)據(jù),在SendValues.aspx.cs調(diào)用 HttpServerUtility對(duì)象的Transfer方法的某個(gè)方法中,修改代碼如下所示。
Context.Items["value1"] = "one";
Context.Items["value2"] = "two";
在GetValues.aspx.cs的Page_Load方法中接收前1個(gè)頁面所傳遞的值,修改代碼如以下代碼所示。
string str = "值1:" + Context.Items["value1"].ToString();
str += "值2:" + Context.Items["value2"].ToString();
5.Application傳值
嚴(yán) 格地說應(yīng)該是通過HttpApplication對(duì)象在服務(wù)器端生成一個(gè)狀態(tài)變量來存儲(chǔ)所需的信息,該HttpApplication對(duì)象變量的可用范圍 覆蓋整個(gè)WEB應(yīng)用程序。所以該對(duì)象一般存儲(chǔ)一些要公布的信息,如在線人數(shù)等,而對(duì)于那些涉及用戶個(gè)人的敏感數(shù)據(jù)則不用這種方法存儲(chǔ)。 HttpApplication對(duì)象有兩個(gè)常用的方法,即Lock和UnLock方法,可用于處理多個(gè)用戶對(duì)存儲(chǔ)在Application變量中的數(shù)據(jù)進(jìn) 行寫入的問題。Lock方法鎖定全部的Application變量,從而阻止其他用戶修改Application對(duì)象的變量值,UnLock方法則解除對(duì) HttpApplication對(duì)象變量的鎖定。通過HttpApplication對(duì)象傳值的方法和Session比較相似,在頁面類的某個(gè)方法中編寫 代碼如下所示。
Application["a"] = "微軟公司";
Application["b"] = "蘋果公司";
Application["c"] = ?“Mac”;
以上代碼很輕松地將三個(gè)字符串值保存在HttpApplication對(duì)象的變量中了,并且這些變量是整個(gè)程序共享的,其他用戶通過相應(yīng)的頁面同樣可以獲取。獲取這些變量的方法如以下代碼所示。
Application.Lock();
string str = "值1:" + Application["a"];
str? += "值2:" + Application["b"];
str? += "值3:" + Application["c"];
Application.UnLock();
注意:雖然使用方式和Session相似,但是Session是對(duì)于每個(gè)單獨(dú)的用戶,當(dāng)該用戶關(guān)閉瀏覽器,則Session失效。HttpApplication對(duì)象存儲(chǔ)的變量是針對(duì)所有訪問程序的用戶,即使有用戶關(guān)閉了瀏覽器,變量的值不會(huì)丟失。
6.跨頁面?zhèn)魉?/strong>
跨 頁面?zhèn)魉秃驼{(diào)用HttpServerUtility對(duì)象的Transfer方法有相似之處,不過效率更高。因?yàn)檎{(diào)用HttpServerUtility對(duì) 象的Transfer方法是基于服務(wù)器的方法,而跨頁面?zhèn)魉褪腔跒g覽器端的。這個(gè)方法主要是設(shè)置控件的“PostBackUrl”屬性,使該控件(如 Button)操作后轉(zhuǎn)向指定頁面,并且這個(gè)指定頁面可以直接獲取前一個(gè)頁面的所有控件對(duì)象及其屬性值。假設(shè)第一個(gè)頁面為 SendValues.aspx,在該頁面中(非*.cs代碼文件)添加兩個(gè)控件,設(shè)置如以下代碼所示。
<asp:TextBox runat="server" ID="PbValue" Text="Geforce TX280"></asp:TextBox>
<asp:Button runat="server" ID="btn6" Text="跨頁面?zhèn)魉头绞?#34; PostBackUrl="~/GetValues.aspx" />
以 上代碼中,TextBox控件的“Text”屬性為“Geforce TX280”,這是所需要傳送的值。而Button控件的“PostBackUrl”屬性指定了GetValues.aspx頁面,該頁面即可接收所需傳 遞的值。在GetValues.aspx.cs的Page_Load方法中,編寫以下代碼。
//PreviousPage為向當(dāng)前頁面?zhèn)鬏斂丶捻撁?br />if (PreviousPage != null)
{
//從PreviousPage容器中搜索“ID”為PbValue的控件,并轉(zhuǎn)換為TextBox類型
TextBox tb = (TextBox)PreviousPage.FindControl("PbValue");
//如果tb不是空引用
if (tb != null)
{
//將tb的“Text”屬性值給str變量
string str = tb.Text;
}
}
以上代碼輕松獲得了前一個(gè)頁面中TextBox控件的“Text”屬性值,這種方法比調(diào)用HttpServerUtility對(duì)象的Transfer方法更加快捷,并減少了處理步驟。
以上為常用的頁面間傳值方法,如果有特殊需要,還可以使用其他方法,例如通過數(shù)據(jù)庫存儲(chǔ)臨時(shí)數(shù)據(jù)等。
?
轉(zhuǎn)自:http://www.it560.com/program/.net/0MMDAwMDAwMzk0MQ.html
轉(zhuǎn)載于:https://www.cnblogs.com/yinyao/archive/2009/11/18/1605115.html
總結(jié)
以上是生活随笔為你收集整理的URL、Session、Cookies、Server.Transfer、Application和跨页面传送。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星mega2 android os,G
- 下一篇: 使用C语言进行面向对象的开发--GObj