.NET頁面之間傳值的幾種方式總結
1、 QueryString
當頁面上的form以get方式向頁面傳送請求資料時,web server將請求資料放入一名為QEURY_STRING的環境變數中,QeueryString方法從這個變數中取出相應的值。
先建立兩個WebForm,分別為WebForm1和WebForm2,WebForm1新增兩個文字框用於輸入客戶端的輸入,一個按鈕用於導航到要傳值的頁面WebForm2,在目的頁新增一個文字框用於顯示傳遞過來的值。
WebForm1按鈕單擊程式碼:
string url = "WebForm2.aspx?name="+ txtName.Text + "&age=" +txtAge.Text;
Response.Redirect(url);
WebForm2按鈕單擊程式碼:
TextBox1.Text = "姓名是:" + Request.QueryString["name"] + "年齡是:" +Request.QueryString["age"];
優點:使用簡單;
缺點:安全性低,傳遞的值會顯示在瀏覽器的url中;不能傳遞物件;
(涉及知識:HTTP協議,request和response物件,get和post區別,redirect和method區別)
2、 Session
把需要傳的值放在Session變數,然後在另外一個變數中使用它,session存放在伺服器端,在Session變數中儲存過多的變數會消耗較多的伺服器資源,也該及時清理不需要的Session變數。
優點:能傳遞複雜物件,資料量大小不限制
缺點:作為全域性變數,容易誤操作
WebForm1按鈕單擊程式碼:
Session["name"]= txtName.Text;
Session["age"]= txtAge.Text;
Server.Transfer("WebForm2.aspx");
WebForm2按鈕單擊程式碼:
TextBox1.Text = "姓名是:" +Session["name"].ToString() + "年齡是:" + Session["age"].ToString();
Session.Remove("name");
Session.Remove("age");
(涉及:Session物件,Server物件,transfer方法)
3、 Application
Application在整個應用程式生命週期都是有效的,類似於使用全域性變數,是所有的使用者共用的全域性變數,session是各個使用者獨有的全域性變數,一般用於記錄使用者資訊。
WebForm1按鈕單擊程式碼:
Application.Lock();
Application["name"] = txtName.Text;
Application["age"] = txtAge.Text;
Server.Transfer("WebForm2.aspx");
Application.UnLock();
WebForm2按鈕單擊程式碼:
TextBox1.Text ="姓名是:" + Application["name"].ToString()+ "年齡是:" +Application["age"].ToString();
(涉及:application物件,從一個頁面轉到另一個頁面的方式;全域性變數的改變,加鎖)
4、 Cookie
Cookie用於在客戶端儲存使用者的相關資訊,它通過HTTP頭傳遞資訊,只能包含字串的值,通過Request物件的Cookie集合可以獲得瀏覽器所有的Cookie
優點:使用簡單,使用者儲存使用者狀態
缺點:被認為用來收集使用者隱私而遭到批評
WebForm1按鈕單擊程式碼:
HttpCookie name =new HttpCookie("name1");
HttpCookieage = new HttpCookie("age1");
name.Value = txtName.Text;
age.Value = txtAge.Text;
Response.Cookies.Add(name);
Response.Cookies.Add(age);
Server.Transfer("WebForm2.aspx");
WebForm2按鈕單擊程式碼:
TextBox1.Text = "姓名是:" +Request.Cookies["name1"].Value.ToString() + "年齡是:" +Request.Cookies["age1"].Value.ToString();
(涉及:cookie,Response.AppendCookie和Response.Cookies.Add區別,cookie儲存)
5、 Server.Transfer
上面四種方式常常在ASP中使用,這個方法是在ASP.NET中才出現的,它用在從當前頁面轉到新的ASPX頁面,伺服器端執行新頁面並輸出,在新頁面中通過Context.Handler來獲得前一個頁面傳遞的各種型別的值、表單資料、QueryString;使用Server.Transfer時,當前頁面終止執行,執行流轉入另一個頁面,但新的頁面仍使用前一個頁面建立的應答流。
(1)Server.Transfer在伺服器端完成,所以客戶端瀏覽器中的URL地址是不會改變的;Response.Redirect是客戶端完成,向伺服器端提出新的頁面處理請求,所以客戶端瀏覽器中的URL地址是會改變的。
(2)Server.Transfer在伺服器端完成,不需要客戶端提出請求,減少了客戶端對伺服器端提出請求。
(3)Server.Transfer只能夠轉跳到本地虛擬目錄指定的頁面,也就是工程專案中的頁面,而Response.Redirect則十分靈活,可以跳轉到任何URL地址。
(4)Server.Transfer可以將前一個頁面的各種型別的值傳到新的頁面;Response.Redirect則只能藉助URL中帶引數或是結合上面四種辦法把各種型別的值傳到新的頁面。
優點:直接在伺服器端重定向,使用簡單方便,減少了客戶端對伺服器端提出請求;可以傳遞各種資料型別的值和控制元件的值。
缺點:客戶端瀏覽器中的URL地址是不改變,會導致在新的頁面可能出現一些意想不到的問題。比如如果源頁面和目的頁面不在同一個虛擬目錄或其子目錄下,那麼使用相對路徑的圖片、超連結都會導致錯誤的指向。
需要注意的是獲取這些值必須在新的頁面首次載入時,才能正確獲取上一頁面的各種資料型別或是控制元件的值。在以後的postback時,就無法獲取上一頁面的各種資料型別或是控制元件的值了,因為此時得到的當前頁面的例項. 所以需要在新頁面(destinationWebForm.aspx)的Page_Load()事件中使用if(!IsPostBack)把獲取前一個頁 面的值的程式碼包含起來,才能獲得前一個頁面傳遞的各種資料型別的值、表單資料、QueryString。
Server.Transfer第二引數如果為true,表示本頁面的Form和QuerryString的值在新頁面繼續有效
WebForm1按鈕單擊程式碼:
ArrayList myList =new ArrayList(3);
myList.Add("first");
myList.Add("second");
myList.Add("third");
Context.Items["destList"] = myList;
Context.Items.Add("newContext","hello");
Server.Transfer("WebForm2.aspx",true);
WebForm2按鈕單擊程式碼:
if (!IsPostBack)
{
try
{
WebForm1 formPage = (WebForm1)Context.Handler;
ArrayList list = (ArrayList)Context.Items["destList"];
TextBox1.Text = "姓名是:" + formPage.Name + "年齡是:" + formPage.Age
+ " " +Context.Items["newContext"].ToString() + "first:" +list[0];
}
catch
{
Response.Write("error");
}
}
(涉及:IsPostBack,context)