一.使用QueryString
使用QueryString在頁(yè)面間傳遞值是一種非常常見的方法,我們?cè)贏SP中就常常用到。
(1)優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1.使用簡(jiǎn)單,對(duì)于安全性要求不高時(shí)傳遞數(shù)字或是文本值非常有效。
缺點(diǎn):
1.缺乏安全性,由于它的值暴露在瀏覽器的URL地址中的。
2.不能傳遞對(duì)象。
(2)使用方法
1.在源頁(yè)面的代碼中用需要傳遞的名稱和值構(gòu)造URL地址。
2.在源頁(yè)面的代碼用Response.Redirect(URL);重定向到上面的URL地址中。
3.在目的頁(yè)面的代碼使用Request.QueryString["name"];取出URL地址中傳遞的值。
(3)應(yīng)用舉例
1.源頁(yè)面*.aspx的代碼:
private void Button1_Click(object sender, System.EventArgs e)
{
string urlAddress;
string Name1;
string Name2;
string Name3;
string Name1Value = "HelloName1";
int Name2Value = 1234567;
string Name3Value = "你好名稱3";
urlAddress = "destinationWebForm.aspx?Name1=" + Name1Value + "&" + "Name2=" + Name2Value.ToString() + "&" + "Name3=" + Name3Value;
Response.Redirect(urlAddress);
}
2.目的頁(yè)面destinationWebForm.aspx的代碼:
private void Page_Load(object sender, System.EventArgs e)
{
string myName1Value;
int myName2Value;
string myName3Value;
myName1Value = Request.QueryString["Name1"];
myName2Value = Convert.ToInt32(Request.QueryString["Name2"]);
myName3Value = Request.QueryString["Name3"];
}
(4)可能出現(xiàn)的問題
1在處理Resonse.QueryString函數(shù)漢字參數(shù)傳遞時(shí),發(fā)生不能完整傳遞參數(shù)的具體值的錯(cuò)誤,解決有兩個(gè)方法。
方法一:需要重新設(shè)置Web.config中的encoding和全球化設(shè)置。
1、首行:<?xml version="1.0" encoding="utf-8" ?>
更改為:
<?xml version="1.0" encoding="GB2312" ?>
2、<!-- 全球化
此節(jié)設(shè)置應(yīng)用程序的全球化設(shè)置。
-->
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>
更改為:
<!-- 全球化
此節(jié)設(shè)置應(yīng)用程序的全球化設(shè)置。
-->
<globalization
requestEncoding="GB2312"
responseEncoding="GB2312"
/>
[1]
方法二:使用Server.UrlEncode和Server.UrlDecode對(duì)漢字或者特殊字符進(jìn)行編碼和解碼。
二、使用Application變量
使用Application變量是在頁(yè)面間傳遞值的第二種方式。
Application變量在整個(gè)應(yīng)用程序生命周期中都是有效的,類似于使用全局變量一樣,所以可以在不同頁(yè)面中對(duì)它進(jìn)行存取。它和Session變量的區(qū)別在于,前者是所有的用戶共用的全局變量,后者是各個(gè)用戶獨(dú)有的全局變量。
舉個(gè)例子來解釋:
網(wǎng)站訪問的計(jì)數(shù)器變量一般采用Application變量,多個(gè)請(qǐng)求訪問時(shí)共享這一個(gè)變量,均可對(duì)它進(jìn)行操作,該變量可以被整個(gè)應(yīng)用程序的各個(gè)頁(yè)面直接使用。
用戶登陸的賬號(hào)名一般采用Session變量,多個(gè)請(qǐng)求訪問時(shí)有各自的Session變量,只能對(duì)自己的該Session變量進(jìn)行操作,整個(gè)應(yīng)用程序的各個(gè)頁(yè)面直接使用這個(gè)變量來獲得用戶的基本信息。
(1)優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1.使用簡(jiǎn)單,消耗較少的服務(wù)器資源。
2.不僅能傳遞簡(jiǎn)單數(shù)據(jù),還能傳遞對(duì)象。
3.數(shù)據(jù)量大小是不限制的。
缺點(diǎn):
1.作為全局變量容易被誤操作。
(2)使用方法
1.在源頁(yè)面的代碼中創(chuàng)建你需要傳遞的名稱和值構(gòu)造Application變量:Application["Nmae"]="Value(Or Object)";
2.在目的頁(yè)面的代碼使用Application變量取出傳遞的值。Result = Application["Nmae"]
(3)應(yīng)用舉例
1.源頁(yè)面 *.aspx的代碼:
private void Button1_Click(object sender, System.EventArgs e)
{
string Name1Value = "HelloName1";
int Name2Value = 1234567;
Application["Name1"] = Name1Value;
Application["Name2"] = Name2Value;
}
2.目的頁(yè)面 *.aspx的代碼:
private void Page_Load(object sender, System.EventArgs e)
{
string myName1Value;
int myName2Value;
myName1Value = Application["Name1"].ToString();
myName2Value = (int)Application["Name2"];
}
三、使用Session變量
使用Application變量是在頁(yè)面間傳遞值的第三種方式。Session變量和Application變量非常類似,它們的區(qū)別也已經(jīng)在上面關(guān)于Application變量時(shí)提到了。
(1)優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1.使用簡(jiǎn)單,不僅能傳遞簡(jiǎn)單數(shù)據(jù)類型,還能傳遞對(duì)象。
2.數(shù)據(jù)量大小是不限制的。
缺點(diǎn):
1.在Session變量存儲(chǔ)大量的數(shù)據(jù)會(huì)消耗較多的服務(wù)器資源。
(2)使用方法
1.在源頁(yè)面的代碼中創(chuàng)建你需要傳遞的名稱和值構(gòu)造Session變量:Session["Nmae"]="Value(Or Object)";
2.在目的頁(yè)面的代碼使用Session變量取出傳遞的值。Result = Session["Nmae"]
(3)應(yīng)用舉例
與Application變量類似,只是將Application替換為Session即可。
四、使用Cookie對(duì)象
使用Cookie對(duì)象是在頁(yè)面間傳遞值的第四種方式。Cookie用于在用戶瀏覽器上存儲(chǔ)小塊的信息,保存用戶的相關(guān)信息,比如用戶訪問某網(wǎng)站時(shí)用戶的ID,用戶的偏好等,用戶下次訪問就可以通過檢索獲得以前的信息。所以Cookie也可以在頁(yè)面間傳遞值。Cookie通過HTTP頭在瀏覽器和服務(wù)器之間來回傳遞的。Cookie只能包含字符串的值,如果想在Cookie存儲(chǔ)整數(shù)值,那么需要先轉(zhuǎn)換為字符串的形式。
可以通過遍歷Request對(duì)象的Cookie集合可以獲得所有的瀏覽器所有的Cookie。方法如下:
foreach (string strKey in Request.Cookies)
{
lblCookies.Text += strKey + "=" + Request.Cookies[ strKey ].Value;
}
(1)優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1.使用簡(jiǎn)單,是保持用戶狀態(tài)的一種非常常用的方法。比如在購(gòu)物網(wǎng)站中用戶跨多個(gè)頁(yè)面表單時(shí)可以用它來保持用戶狀態(tài)。
缺點(diǎn):
1.常常被人認(rèn)為用來收集用戶隱私而遭到批評(píng)。
(2)使用方法
1.在源頁(yè)面的代碼中創(chuàng)建你需要傳遞的名稱和值構(gòu)造Cookie對(duì)象:
HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
Response.Cookies.Add(cookie);
2.在目的頁(yè)面的代碼使用Cookie對(duì)象取出傳遞的值:Result = Request.Cookies[ "myCookie" ].Value;
(3)應(yīng)用舉例
1.源頁(yè)面 *.aspx的代碼:
private void Button1_Click(object sender, System.EventArgs e)
{
HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
Response.Cookies.Add(objCookie);
}
2.目的頁(yè)面 *.aspx的代碼:
private void Page_Load(object sender, System.EventArgs e)
{
string myName1Value;
myName1Value = Request.Cookies[ "myCookie" ].Value;
}
五、使用Server.Transfer
使用Server.Transfer變量是在頁(yè)面間傳遞值的第五種方式。上面的四個(gè)方法我們?cè)贏SP中常常使用,但是這個(gè)方法是在ASP.NET中新出現(xiàn)的。Server.Transfer是從當(dāng)前的ASPX頁(yè)面轉(zhuǎn)到新的ASPX頁(yè)面,服務(wù)器端執(zhí)行新頁(yè)并輸出,在新頁(yè)面中通過Context.Handler來獲得前一個(gè)頁(yè)面?zhèn)鬟f的各種數(shù)據(jù)類型的值、表單數(shù)據(jù)、QueryString.由于重定向完全在服務(wù)器端完成,所以客戶端瀏覽器中的URL地址是不會(huì)改變的。
調(diào)用Server.Transfer時(shí),當(dāng)前的ASPX頁(yè)面終止執(zhí)行,執(zhí)行流程轉(zhuǎn)入另一個(gè)ASPX頁(yè)面,但新的ASPX頁(yè)面仍使用前一ASPX頁(yè)面創(chuàng)建的應(yīng)答流。[2]
在這里比較一下Server.Transfer和在“一”中使用的Response.Redirect的區(qū)別。
(1)Server.Transfer在服務(wù)器端完成,所以客戶端瀏覽器中的URL地址是不會(huì)改變的;Response.Redirect是客戶端完成,向服務(wù)器端提出新的頁(yè)面處理請(qǐng)求,所以客戶端瀏覽器中的URL地址是會(huì)改變的。
(2)Server.Transfer在服務(wù)器端完成,不需要客戶端提出請(qǐng)求,減少了客戶端對(duì)服務(wù)器端提出請(qǐng)求。[2]
(3)Server.Transfer只能夠轉(zhuǎn)跳到本地虛擬目錄指定的頁(yè)面,也就是工程項(xiàng)目中的頁(yè)面,而Response.Redirect則十分靈活,可以跳轉(zhuǎn)到任何URL地址。
(4)Server.Transfer可以將前一個(gè)頁(yè)面的各種類型的值傳到新的頁(yè)面;Response.Redirect則只能借助URL中帶參數(shù)或是結(jié)合上面四種辦法把各種類型的值傳到新的頁(yè)面。
繼續(xù)我們的Server.Transfer用法。
(1)優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1.直接在服務(wù)器端重定向,使用簡(jiǎn)單方便,減少了客戶端對(duì)服務(wù)器端提出請(qǐng)求。
2.可以傳遞各種數(shù)據(jù)類型的值和控件的值。
缺點(diǎn):
1.客戶端瀏覽器中的URL地址是不改變,會(huì)導(dǎo)致在新的頁(yè)面可能出現(xiàn)一些意想不到的問題。比如如果源頁(yè)面和目的頁(yè)面不在同一個(gè)虛擬目錄或其子目錄下,那么使用相對(duì)路徑的圖片、超鏈接都會(huì)導(dǎo)致錯(cuò)誤的指向。[3]
(2)使用方法
1.在源頁(yè)面的代碼中,使用Page類的Server.Transfer跳到另一個(gè)頁(yè)面?zhèn)鬟f頁(yè)面數(shù)據(jù):
Server.Transfer("destinationWebForm.aspx","false")。
2.在目的頁(yè)面中,使用Context.Handler來接收數(shù)據(jù):
FormerPage formerPage = (FormerPage)Context.Handler;
然后用formerPage的屬性和方法來獲取前一個(gè)頁(yè)面的值,或者直接用
Context.Items["myParameter "]
來獲取前一個(gè)頁(yè)面的值。
需要注意的是獲取這些值必須在新的頁(yè)面首次加載時(shí),才能正確獲取上一頁(yè)面的各種數(shù)據(jù)類型或是控件的值。在以后的postback時(shí),就無法獲取上一頁(yè)面的各種數(shù)據(jù)類型或是控件的值了,因?yàn)榇藭r(shí)得到的當(dāng)前頁(yè)面的實(shí)例. 所以需要在新頁(yè)面(destinationWebForm.aspx)的Page_Load()事件中使用if(!IsPostBack)把獲取前一個(gè)頁(yè)面的值的代碼包含起來,才能獲得前一個(gè)頁(yè)面?zhèn)鬟f的各種數(shù)據(jù)類型的值、表單數(shù)據(jù)、QueryString。
(3)應(yīng)用舉例
1.源頁(yè)面 FormerPage.aspx的代碼:
public string HelloContextAttribute
{
get
{
return "Use Attribute: Hello,Context";
}
}
public string HelloContextMethod()
{
return "Call Method: Hello,Context!";
}
public string TextBoxValue
{
get
{
return TextBox1.Text;
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
string Name1Value = "Hello, Name1!";
TextBox1.Text ="Hello,TextBox1!";
ArrayList myList = new ArrayList(3);//創(chuàng)建動(dòng)態(tài)數(shù)組
myList.Add("Hello,Array1! ");//向動(dòng)態(tài)數(shù)組中添加新的值
myList.Add("Hello,Array2!");
myList.Add("Hello,Array3!");
//Context可保存任意數(shù)據(jù)類型,Context字典特定于某個(gè)Http請(qǐng)求。
//對(duì)于不同客戶端,值是不一樣的。
Context.Items["destinationList"] = myList;//在Context.Items中保存動(dòng)態(tài)數(shù)組
Context.Items.Add("newContext","Hello,NewContext");//在Context.Items中保存一組名稱-值的數(shù)據(jù)
//Server.Transfer第二參數(shù)如果為true,表示本頁(yè)面的Form和QuerryString的值在新頁(yè)面繼續(xù)有效。
//否則在新頁(yè)面無法獲得TextBox1的值。
Server.Transfer("destinationWebForm.aspx?Name1="+ Name1Value,true);
}
2.目的頁(yè)面 destinationWebForm.aspx的代碼:
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
try
{
string helloContextAttribute;
string helloContextMethod;
string textBoxValue;
string contextItemsValue;
string queryString;
ArrayList listResult;
FormerPage formerPage = (FormerPage)Context.Handler;
helloContextAttribute = formerPage.HelloContextAttribute;//通過FormerPage中定義的屬性來獲取值
helloContextMethod = formerPage.HelloContextMethod();//通過FormerPage中定義的方法來獲取值
textBoxValue = formerPage.TextBoxValue;//通過FormerPage中返回文本控件的值
//下面的方法多用于用戶在控件中輸入值后才能獲取,但是在程序中給直接TextBox1.Text賦值,那么下面的方法獲得
//的空值,在這種情況下需要使用上面的獲取方法
//textBoxValue = Request.Form["TextBox1"];
contextItemsValue = Context.Items["newContext"].ToString();//通過FormerPage中Context的Items獲取值
listResult = (ArrayList)Context.Items["destinationList"];//通過FormerPage中Context的Items獲取對(duì)象,強(qiáng)制轉(zhuǎn)換類型:
queryString = Request.QueryString["Name1"];//通過FormerPage的URL中的QueryString獲取值
}
catch
{
Response.Write("Error!");
}
}
}