.net 頁(yè)面?zhèn)鲄⒎绞娇偨Y(jié)

轉(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ù)端并返回。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評(píng)論 19 139
  • 一、QueryString傳值: ** 這是最簡(jiǎn)單的傳值方式,但缺點(diǎn)是傳的值會(huì)顯示在瀏覽器的地址欄中且不能傳遞對(duì)象...
    ConRon閱讀 1,091評(píng)論 0 0
  • 分布式Session的幾種實(shí)現(xiàn)方式 1.基于數(shù)據(jù)庫(kù)的Session共享 2.基于NFS共享文件系統(tǒng) 3.基于mem...
    王帥199207閱讀 2,369評(píng)論 0 3
  • Ksjsjsj
    ____祐閱讀 209評(píng)論 0 0
  • 2016年9月24日,此刻在路上。說(shuō)起來(lái)有些狗血,因?yàn)槟承┎豢煽沽ψ约哄e(cuò)過(guò)了上一班高鐵,無(wú)奈之舉只能換乘。車(chē)...
    千年逅閱讀 276評(píng)論 0 0

友情鏈接更多精彩內(nèi)容