ASP.NET 頁面之間傳遞值方式優缺點比較

來源:互聯網
上載者:User

本題考查面試者對ASP.NET中多頁面傳值的理解是否全面。因為ASP.NET的頁面表單提交到自身,完成回傳的功能,所以預設情況下不能使用POST方式進行多頁面傳值。關於這些傳值方式的分析如下所示。
1.URL傳值
這是經典的傳值方式,這種方法的使用非常簡單,不過所傳遞的值是會顯示在瀏覽器的地址欄上的,而且不能傳遞對象。所以這種方法一般用於傳遞的值少且安全性要求不高的情況下。在*.aspx頁面開發中可以使用超級連結文本進行傳值,如以下代碼所示。
<asp:HyperLink runat="server" ID="HpLink"
NavigateUrl="~/GetValues.aspx?urlvalue1=intel&urlvalue2=amd">URL傳值</asp:HyperLink>
以上連結文本將頁面跳轉到GetValues.aspx頁面,並且通過URL傳遞urlvalue1變數和urlvalue2變數,其值分別為intel和amd。在*.cs的伺服器端方法中也可以調用HttpResponse對象的Redirect方法,將瀏覽器端重新導向到新頁面並通過URL傳值,如以下代碼所示。
Response.Redirect(“~/GetValues.aspx?urlvalue1=intel&urlvalue2=amd”);
2.Session傳值
這種方法將每份資料存放區於伺服器變數中,可以傳遞比較多的資料,並且安全性較高,所以常用於使用者身份的驗證功能中。不過,Session變數如果儲存過多的資料會消耗過多的伺服器資源,編程者在使用時應該謹慎,其使用方法如以下代碼所示。
Session["SessionValue"] = “ATI”;
//也可以用索引儲存
Session[0] = “ATI”;
//在其他頁面的伺服器端方法中取值方式為:
string str = Session["SessionValue"].ToString();
//也可以用索引擷取
string str = Session[0].ToString();
Session的可在應用程式的多個頁面中以成對的名稱和數值的方式共用,直到瀏覽使用者關閉自己的瀏覽器或者伺服器Session逾時(可設定,預設為20分鐘)。
3.Cookie傳值
Cookie是一種比較特殊的資料存放區方式,因為這種方式將資料存放區於瀏覽使用者的電腦中,以文字檔的形式存在於磁碟中。這種方式非常有意思,很多登入系統就是利用Cookie實現使用者自動登入。即使用者登入一次的登入資訊將被寫入到使用者電腦的Cookie檔案中,下次登入時,網站自動讀取該Cookie完成身分識別驗證。通過Cookie傳遞資料雖然很方便,儲存時間可以自由設定,但是安全性不高,編程者不應過於依賴Cookie,而應採用結合的方式完成敏感性資料的儲存。
ASP.NET中操作Cookie的主要類型位於System.Web命名空間下,分別為HttpCookie、HttpResponse以及HttpRequest。HttpCookie可建立和操作獨立Cookie的安全類型,訪問HttpResponse和HttpRequest的Cookies屬性可以擷取HttpCookieCollection集合對象,以讀取或添加HttpCookie對象。添加Cookie的方法如以下代碼所示。
//建立一個HttpCookie 對象,向建構函式傳遞名稱值
HttpCookie ck = new HttpCookie("CookieValue");
//設定ck的“Value”屬性(值)
ck.Value = “Cookie值”;
//設定ck的到期時間為目前時間加上360s,即6分鐘後失效
ck.Expires = DateTime.Now.AddSeconds(360);
//設定ck有效範圍(域限制)
ck.Domain = "www.google.cn";
//將ck添加至HttpCookieCollection對象
Response.Cookies.Add(ck);
//也可為以下方法添加
//Response.AppendCookie(ck);;
讀取使用者的Cookie則更為簡單,只需根據名稱讀取HttpCookieCollection集合對象中的子項即可,如以下代碼所示。
string str = Request.Cookies["CookieValue"].Value;
除此之外,還可以利用一個HttpCookie儲存多個成對的名稱和數值形式的Cookie資訊,如以下代碼所示。
HttpCookie ck = new HttpCookie("CookieValue");
//以成對的名稱和數值的方式添加多個Cookie資訊
ck.Values.Add("value1", “one”);
ck.Values.Add("value2", "two");
//設定ck的到期時間為目前時間加上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"];
說明:多數瀏覽器支援最多可達4096位元組的Cookie,如果要將為數不多的幾個值儲存到使用者電腦上,瀏覽器還限制了每個網站可以在使用者電腦上儲存的Cookie數量。大多數瀏覽器只允許每個網站儲存20個Cookie。如果試圖儲存更多的Cookie,則最先儲存的Cookie就會被刪除。還有些瀏覽器會對來自所有網站的Cookie總數作出限制,這個限制通常為300個。使用者可以設定自己的瀏覽器,拒絕接受Cookie,這種情況下只能結合其他的資料存放區方式。
4.Server.Transfer傳值
這個方法的步驟相對較多,使用該方法編程者可以在另一個頁面以公開對象屬性的方式來存取值,使用這種方法是物件導向的。該方法的代碼編寫並不複雜,首先通過定義一個public許可權的屬性,該屬性可返回所需傳遞的值。然後在第兩個頁面中,使用Context.Handler屬性來獲得前一個頁面執行個體對象的引用,即可通過訪問自訂的屬性擷取需要的值。
假設SendValues.aspx頁面為傳遞資料的頁面,在SendValues.aspx.cs的頁面類中定義一個public屬性,通過get直接返回需要傳遞的值(可為頁面中某個伺服器控制項的屬性值)。
public string TransferData
{
get
{
return "VIA";
}
}
在SendValues.aspx.cs的某個方法(如Button控制項的Click事件處理方法)中調用HttpServerUtility對象的Transfer方法,如以下代碼所示。
Server.Transfer("~/GetValues.aspx");
假設GetValues.aspx為第二個頁面,在GetValues.aspx.cs的Page_Load方法中接收前一個頁面所傳遞的值,方法如以下代碼所示。
//定義SendValues類型的變數SV_Page
SendValues SV_Page;
//訪問HttpContext對象的Handler屬性,將值轉換為SendValues類型,引用賦值給SV_Page
SV_Page = (SendValues)Context.Handler;
//SV_Page即為SendValues.aspx頁面類的對象,直接擷取其TransferData屬性值
string str = SV_Page.TransferData;
可見,這種方法對於有物件導向基礎的編程者而言非常容易理解。不過頁面間如果需要傳遞數量比較多的值,這種方法需要定義過多的屬性,略顯繁雜。編程者還可以直接使用HttpContext對象的“Iterms”屬性添加多項成對的名稱和數值的資料,在SendValues.aspx.cs調用HttpServerUtility對象的Transfer方法的某個方法中,修改代碼如下所示。
Context.Items["value1"] = "one";
Context.Items["value2"] = "two";
在GetValues.aspx.cs的Page_Load方法中接收前1個頁面所傳遞的值,修改代碼如以下代碼所示。
string str = "值1:" + Context.Items["value1"].ToString();
str += "值2:" + Context.Items["value2"].ToString();
5.Application傳值
嚴格地說應該是通過HttpApplication對象在伺服器端產生一個狀態變數來儲存所需的資訊,該HttpApplication物件變數的可用範圍覆蓋整個WEB應用程式。所以該對象一般儲存一些要公布的資訊,如線上人數等,而對於那些涉及使用者個人的敏感性資料則不用這種方法儲存。HttpApplication對象有兩個常用的方法,即Lock和UnLock方法,可用於處理多個使用者對儲存在Application變數中的資料進行寫入的問題。Lock方法鎖定全部的Application變數,從而阻止其他使用者修改Application對象的變數值,UnLock方法則解除對HttpApplication物件變數的鎖定。通過HttpApplication對象傳值的方法和Session比較相似,在頁面類的某個方法中編寫代碼如下所示。
Application["a"] = "微軟公司";
Application["b"] = "蘋果公司";
Application["c"] = “Mac”;
以上代碼很輕鬆地將三個字串值儲存在HttpApplication對象的變數中了,並且這些變數是整個程式共用的,其他使用者通過相應的頁面同樣可以擷取。擷取這些變數的方法如以下代碼所示。
Application.Lock();
string str = "值1:" + Application["a"];
str += "值2:" + Application["b"];
str += "值3:" + Application["c"];
Application.UnLock();
注意:雖然使用方式和Session相似,但是Session是對於每個單獨的使用者,當該使用者關閉瀏覽器,則Session失效。HttpApplicationObject Storage Service的變數是針對所有訪問程式的使用者,即使有使用者關閉了瀏覽器,變數的值不會丟失。
6.跨頁面傳送
跨頁面傳送和調用HttpServerUtility對象的Transfer方法有相似之處,不過效率更高。因為調用HttpServerUtility對象的Transfer方法是基於伺服器的方法,而跨頁面傳送是基於瀏覽器端的。這個方法主要是設定控制項的“PostBackUrl”屬性,使該控制項(如Button)操作後轉向指定頁面,並且這個指定頁面可以直接擷取前一個頁面的所有控制項對象及其屬性值。假設第一個頁面為SendValues.aspx,在該頁面中(非*.cs代碼檔案)添加兩個控制項,設定如以下代碼所示。
<asp:TextBox runat="server" ID="PbValue" Text="Geforce TX280"></asp:TextBox>
<asp:Button runat="server" ID="btn6" Text="跨頁面傳送方式" PostBackUrl="~/GetValues.aspx" />
以上代碼中,TextBox控制項的“Text”屬性為“Geforce TX280”,這是所需要傳送的值。而Button控制項的“PostBackUrl”屬性指定了GetValues.aspx頁面,該頁面即可接收所需傳遞的值。在GetValues.aspx.cs的Page_Load方法中,編寫以下代碼。
//PreviousPage為向當前頁面傳輸控制項的頁面
if (PreviousPage != null)
{
//從PreviousPage容器中搜尋“ID”為PbValue的控制項,並轉換為TextBox類型
TextBox tb = (TextBox)PreviousPage.FindControl("PbValue");
//如果tb不是Null 參考
if (tb != null)
{
//將tb的“Text”屬性值給str變數
string str = tb.Text;
}
}
以上代碼輕鬆獲得了前一個頁面中TextBox控制項的“Text”屬性值,這種方法比調用HttpServerUtility對象的Transfer方法更加快捷,並減少了處理步驟。
以上為常用的頁面間傳值方法,如果有特殊需要,還可以使用其他方法,例如通過資料庫儲存臨時資料等。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.