.net 页面传参方式总结
?ASP.NET為我們提供了三種方式,一種是可以通過用QueryString來傳送相應的值,再一種是通過session變量來傳送相應的值,還有就是 通過Server.Transfer方法來實現。下面分別一一介紹:
一、使用Querystring
Querystring是一種非常簡單的傳值方式,其缺點就是:安全性低。會把要傳送的值顯示在瀏覽器的地址欄中(也就是不需要保密得參數),并且在此方法中不能夠傳遞對象,參數的長度不能大于 1024字節(?),當參數中有中文得時候,通常需要使用HttpUlitity.UrlEncode方法來對參數進行編碼和解碼。
優點:速度快。如果你想傳遞一個安全性不是那么太重要或者是一個簡單的數值時,用此方法最好不過了。下面通過一個小例子來完成傳值工作,步驟如下:
1、創建一個web form
2、在新建的web form中放置一個button1,在放置兩個TextBox1,TextBox2
3、為button按鈕創建click事件
代碼如下:
privatevoid Button1_Click
(object sender, System.EventArgs e)
{
string url;
url="webform2.aspx?name="+
??? TextBox1.Text +"&email="+
??? TextBox2.Text;
Response.Redirect(url);
}
4、新建一個目標頁面命名為webform2
5、在webform2中放置兩個Label1,Label2
在webform2的Page_Load中添加如下代碼:
privatevoid Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Request.QueryString["name"];
Label2.Text=Request.QueryString["email"];
}
運行,即可看到傳遞后的結果了。
二、使用Session變量
?
使用Session變量傳值是一種最常見的方式了,此中方式不僅可以把值傳遞到下一個頁面,還可以交叉傳遞到多個頁面,直至把Session變量的值removed后,變量才會消失。舉個例子看看:
1、創建一個web form
2、在新建的web form中放置一個button1,在放置兩個TextBox1,TextBox2
3、為button按鈕創建click事件
代碼如下:
privatevoid Button1_Click
(object sender, System.EventArgs e)
{
????????? Session["name"]=TextBox1.Text;???
????????? Session["email"]=TextBox2.Text;???
????????? Response.Redirect("webform2.aspx");
}
4、新建一個目標頁面命名為webform2
5、在webform2中放置兩個Label1,Label2
在webform2的Page_Load中添加如下代碼:
privatevoid Page_Load
(object sender, System.EventArgs e)
{
???????? Label1.Text=Session["name"].ToString();
???????? Label2.Text=Session["email"].ToString();
???????? Session.Remove("name");
???????? Session.Remove("email");
}
運行,即可看到傳遞后的結果了。
?這種方法得優缺點是:使用Session變量往往會占用服務器端的內存使用,所以再網頁流量很大的時候,Session便不能很好的完成傳值得任務,由于session有一個timeout,所以在使用的時候對用戶得操作也有一定的影響。
三、使用Server.Transfer
雖然這種方法有點復雜,但也不失為一種在頁面傳值的方式。使用該方法你可以在另一個頁面以對象屬性的方式來存取顯露的值,當然了,使用這種方法,你需要額外寫一些代碼以創建一些屬性以便可以在另一個頁面訪問它,但是,這個方式帶來的好處也是顯而易見的.
舉個例子看看:
1、創建一個web form
2、在新建的web form中放置一個button1,在放置兩個TextBox1,TextBox2
3、為button按鈕創建click事件
代碼如下:
privatevoid Button1_Click
(object sender, System.EventArgs e)
{
???????? Server.Transfer("webform2.aspx");
}
4、創建過程來返回TextBox1,TextBox2控件的值代碼如下:
publicstring Name
{
??get
?? {
????return TextBox1.Text;
?? }
}
publicstring EMail
{
??get
?? {
????return TextBox2.Text;
?? }
}
?
5、新建一個目標頁面命名為webform2
6、在webform2中放置兩個Label1,Label2
在webform2的Page_Load中添加如下代碼:
privatevoid Page_Load
(object sender, System.EventArgs e)
{
????????//創建原始窗體的實例
???????? WebForm1 wf1;
????????//獲得實例化的句柄
???????? wf1=(WebForm1)Context.Handler;
???????? Label1.Text=wf1.Name;
???????? Label2.Text=wf1.EMail;
}
運行,即可看到傳遞后的結果了。
這種方法 優缺點是:需要寫一些額外的代碼創建一些屬性,但是它簡潔清晰,并且是面向對象的。?
四、Application
因為應用程序和它存儲的所有對象可以同時由不同的線程訪問,所以最好只將很少修改的數據與應用程序范圍一起存儲。理想情況是,對象在 Application_Start 事件中初始化,對它的進一步訪問是只讀的。
在下面的示例中,文件在 Application_Start(在 Global.asax 文件中定義)中讀取,內容則以應用程序狀態存儲在 DataView 對象中。
void Application_Start()
{
????? DataSet ds =new DataSet();
????? FileStream fs =new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);
????? StreamReader reader =new StreamReader(fs);
????? ds.ReadXml(reader);
????? fs.Close();
????? DataView view =new DataView(ds.Tables[0]);
????? Application["Source"] = view;
}
在 Page_Load 方法中,DataView 隨后被檢索并用于填充 DataGrid 對象:
void Page_Load(Object sender, EventArgs e)
{
????? DataView Source = (DataView)(Application["Source"]);
????? MyDataGrid.DataSource = Source;
}
此解決方案的優點是只有第一個請求付出檢索數據的代價。所有后面的請求則使用已有的 DataView 對象。由于數據自初始化后從不修改,所以不必為序列化訪問做任何規定。
Application得使用一般是相對于整個項目來說相對靜止的變量,比如數據庫連接變量等。對于那些針對每一個用戶,每一個會話未必一樣得變量就不適用了。通常Application變量得值是在Config終指定。也可以在global.ascx中指定。
?
五、Cookie:
下面的示例說明如何使用客戶端 Cookie 存儲易失的用戶首選項。
在客戶端存儲 Cookie 是 ASP.NET 的會話狀態將請求與會話關聯的方法之一。Cookie 也可以直接用于在請求之間保持數據,但數據隨后將存儲在客戶端并隨每個請求一起發送到服務器。瀏覽器對 Cookie 的大小有限制,因此,只有不超過 4096 字節才能保證被接受。
當數據存儲在客戶端時,文件 cookies1.aspx 中的 Page_Load 方法檢查客戶端是否已發送了 Cookie。如果沒有,則創建并初始化一個新的 Cookie 并將其存儲在客戶端:
protectedvoid Page_Load(Object sender, EventArgs e)
{
?????if (Request.Cookies["preferences1"] ==null)
????? {
????????? HttpCookie cookie =new HttpCookie("preferences1");
????????? cookie.Values.Add"ForeColor", "black");
????????? Response.AppendCookie(cookie);
????? }
}
在同一頁上,再次使用 GetStyle 方法提供存儲在 Cookie 中的個別值:
protected String GetStyle(String key)
{
??? HttpCookie cookie = Request.Cookies["preferences1"];
???if (cookie !=null)
??? {
?????switch (key)
????? {
???????case"ForeColor" :
?????????????return cookie.Values["ForeColor"];
?????????????break;
?????? }???
???? }???
????return"";
}
若要使 Cookie 在會話之間持久,必須將 HttpCookie 類上的 Expires 屬性設置為將來的某個日期。除了 Cookie.Expires 的賦值,下列自定義 .aspx 頁上的代碼與上一個示例相同:
protectedvoid Submit_Click(Object sender, EventArgs e)
{
????? HttpCookie cookie =new HttpCookie("preferences2");
????? cookie.Values.Add("ForeColor",ForeColor.Value);
????? cookie.Expires = DateTime.MaxValue; // Never Expires
????? Response.AppendCookie(cookie);
????? Response.Redirect(State["Referer"].ToString());
}
Cookie作為一種提交,請求時保存數據得方式,又很明顯的優缺點。他的缺點在上面有所表述,比如大小受限,不能保存對象等,另外,作為保存時間,也就 是數據得有效期來說,確是保存得最好的。我們可以通過設置cookie得過期時間等屬性來設置。Cookie又很多常用屬性,包括domain,path 等,這些資料可以在quickstart上獲取到。
六、ViewState:
ASP.NET 為每個控件提供視圖狀態的服務器端注記。控件可以使用類 StateBag 的一個實例上的 ViewState 屬性,在請求之間保存它的內部狀態。StateBag 類提供詞典樣式的接口來存儲與字符串鍵關聯的對象。
文件 pagestate1.aspx 顯示一個可見的面板并使用鍵 PanelIndex 在該頁的視圖狀態下存儲它的索引:
protectedvoid Next_Click(Object sender, EventArgs e )
{
????? String PrevPanelId ="Panel"+ ViewState["PanelIndex"].ToString();
????? ViewState["PanelIndex"] = (int)ViewState["PanelIndex"] +1;
????? String PanelId ="Panel"+ ViewState["PanelIndex"].ToString();
}
注意,如果在多個瀏覽器窗口中打開該頁,每個瀏覽器窗口最初將顯示此名稱面板。每個窗口可以獨立地在面板之間定位。
小結
1. 使用應用程序狀態變量存儲很少修改但經常使用的數據。
2. 使用會話狀態變量存儲特定于某個會話或用戶的數據。數據全部存儲在服務器上。這種方法適于短期的、大量的或敏感的數據。
3. 將少量易失數據存儲在非持久性 Cookie 中。數據存儲在客戶端,在每次請求時發送到服務器,并在客戶端結束執行時失效。
4. 將少量非易失數據存儲在持久性 Cookie 中。數據存儲在客戶端直到失效,并在每次請求時發送到服務器。
5. 將少量請求特定的數據存儲在視圖狀態中。數據從服務器發送到客戶端并返回。
總結
以上是生活随笔為你收集整理的.net 页面传参方式总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11. jsp与servlet之间页面跳
- 下一篇: 四种参数传递的形式——URL,超链接,j