1. 程式人生 > >.NET頁面之間傳值的幾種方式總結

.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.AppendCookieResponse.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)