ASP.NET中實現頁面間的參數傳遞 QueryString/Application/Session/Cookie

來源:互聯網
上載者:User
一.使用QueryString

    使用QueryString在頁面間傳遞值是一種非常常見的方法,我們在ASP中就常常用到。

    (1)優點和缺點
    優點:
    1.使用簡單,對於安全性要求不高時傳遞數字或是文本值非常有效。
    缺點:
    1.缺乏安全性,由於它的值暴露在瀏覽器的URL地址中的。
    2.不能傳遞對象。

    (2)使用方法
    1.在源頁面的代碼中用需要傳遞的名稱和值構造URL地址。
    2.在源頁面的代碼用Response.Redirect(URL);重新導向到上面的URL地址中。
    3.在目的頁面的代碼使用Request.QueryString["name"];取出URL地址中傳遞的值。

    (3)應用舉例

    1.源頁面*.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.目的頁面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)可能出現的問題
1在處理Resonse.QueryString函數漢字參數傳遞時,發生不能完整傳遞參數的具體值的錯誤,解決有兩個方法。

方法一:需要重新設定Web.config中的encoding和全球化設定。

1、首行:<?xml version="1.0" encoding="utf-8" ?>
更改為:
<?xml version="1.0" encoding="GB2312" ?>
2、<!-- 全球化
          此節設定應用程式的全球化設定。
    -->
    <globalization
            requestEncoding="utf-8"
            responseEncoding="utf-8"
   />
更改為:
<!-- 全球化
          此節設定應用程式的全球化設定。
    -->
    <globalization
            requestEncoding="GB2312"
            responseEncoding="GB2312"
   />
    [1]

    方法二:使用Server.UrlEncode和Server.UrlDecode對漢字或者特殊字元進行編碼和解碼。

    二、使用Application變數

    使用Application變數是在頁面間傳遞值的第二種方式。
    Application變數在整個應用程式生命週期中都是有效,類似於使用全域變數一樣,所以可以在不同頁面中對它進行存取。它和Session變數的區別在於,前者是所有的使用者共用的全域變數,後者是各個使用者專屬的全域變數。
    舉個例子來解釋:
    網站訪問的計數器變數一般採用Application變數,多個請求訪問時共用這一個變數,均可對它進行操作,該變數可以被整個應用程式的各個頁面直接使用。
   使用者登陸的帳號名一般採用Session變數,多個請求訪問時有各自的Session變數,只能對自己的該Session變數進行操作,整個應用程式的各個頁面直接使用這個變數來獲得使用者的基本資料。

    (1)優點和缺點

    優點:
    1.使用簡單,消耗較少的伺服器資源。
    2.不僅能傳遞簡單資料,還能傳遞對象。
    3.資料量大小是不限制的。

    缺點:
    1.作為全域變數容易被誤操作。

    (2)使用方法

    1.在源頁面的代碼中建立你需要傳遞的名稱和值構造Application變數:Application["Nmae"]="Value(Or Object)";
    2.在目的頁面的代碼使用Application變數取出傳遞的值。Result = Application["Nmae"]

    (3)應用舉例

    1.源頁面 *.aspx的代碼:

private void Button1_Click(object sender, System.EventArgs e)
   {
    string Name1Value = "HelloName1";   
    int Name2Value = 1234567;

    Application["Name1"] = Name1Value;
    Application["Name2"] = Name2Value;     
   }

    2.目的頁面 *.aspx的代碼:

private void Page_Load(object sender, System.EventArgs e)
   {
    string myName1Value;
    int    myName2Value;

    myName1Value = Application["Name1"].ToString();
    myName2Value = (int)Application["Name2"];
   }

   三、使用Session變數

    使用Application變數是在頁面間傳遞值的第三種方式。Session變數和Application變數非常類似,它們的區別也已經在上面關於Application變數時提到了。

    (1)優點和缺點
    優點:
    1.使用簡單,不僅能傳遞單一資料型別,還能傳遞對象。
    2.資料量大小是不限制的。

    缺點:
    1.在Session變數儲存大量的資料會消耗較多的伺服器資源。

    (2)使用方法

    1.在源頁面的代碼中建立你需要傳遞的名稱和值構造Session變數:Session["Nmae"]="Value(Or Object)";
    2.在目的頁面的代碼使用Session變數取出傳遞的值。Result = Session["Nmae"]

    (3)應用舉例

      與Application變數類似,只是將Application替換為Session即可。

    四、使用Cookie對象

   使用Cookie對象是在頁面間傳遞值的第四種方式。Cookie用於在使用者瀏覽器上儲存小塊的資訊,儲存使用者的相關資訊,比如使用者訪問某網站時使用者的ID,使用者的偏好等,使用者下次訪問就可以通過檢索獲得以前的資訊。所以Cookie也可以在頁面間傳遞值。Cookie通過HTTP頭在瀏覽器和伺服器之間來回傳遞的。Cookie只能包含字串的值,如果想在Cookie儲存整數值,那麼需要先轉換為字串的形式。
可以通過遍曆Request對象的Cookie集合可以獲得所有的瀏覽器所有的Cookie。方法如下:
foreach (string strKey in Request.Cookies)
{
     lblCookies.Text += strKey + "=" + Request.Cookies[ strKey ].Value;
}

    (1)優點和缺點

    優點:
    1.使用簡單,是保持使用者狀態的一種非常常用的方法。比如在購物網站中使用者跨多個頁面表單時可以用它來保持使用者狀態。

    缺點:
    1.常常被人認為用來收集使用者隱私而遭到批評。

    (2)使用方法

    1.在源頁面的代碼中建立你需要傳遞的名稱和值構造Cookie對象:
    HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
    Response.Cookies.Add(cookie);
    2.在目的頁面的代碼使用Cookie對象取出傳遞的值:Result = Request.Cookies[ "myCookie" ].Value;

    (3)應用舉例

    1.源頁面 *.aspx的代碼:

private void Button1_Click(object sender, System.EventArgs e)
   {
    HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
    Response.Cookies.Add(objCookie);      
   }

    2.目的頁面 *.aspx的代碼:

private void Page_Load(object sender, System.EventArgs e)
   {
    string myName1Value;
    myName1Value = Request.Cookies[ "myCookie" ].Value;
   }

    五、使用Server.Transfer

    使用Server.Transfer變數是在頁面間傳遞值的第五種方式。上面的四個方法我們在ASP中常常使用,但是這個方法是在ASP.NET中新出現的。Server.Transfer是從當前的ASPX頁面轉到新的ASPX頁面,伺服器端執行新頁並輸出,在新頁面中通過Context.Handler來獲得前一個頁面傳遞的各種資料類型的值、表單資料、QueryString.由於重新導向完全在伺服器端完成,所以用戶端瀏覽器中的URL地址是不會改變的。
    調用Server.Transfer時,當前的ASPX頁面終止執行,執行流程轉入另一個ASPX頁面,但新的ASPX頁面仍使用前一ASPX頁面建立的應答流。[2]

    在這裡比較一下Server.Transfer和在“一”中使用的Response.Redirect的區別。
    (1)Server.Transfer在伺服器端完成,所以用戶端瀏覽器中的URL地址是不會改變的;Response.Redirect是用戶端完成,向伺服器端提出新的頁面處理請求,所以用戶端瀏覽器中的URL地址是會改變的。
     (2)Server.Transfer在伺服器端完成,不需要用戶端提出請求,減少了用戶端對伺服器端提出請求。[2]
    (3)Server.Transfer只能夠轉跳到本地虛擬目錄指定的頁面,也就是工程項目中的頁面,而Response.Redirect則十分靈活,可以跳轉到任何URL地址。
    (4)Server.Transfer可以將前一個頁面的各種類型的值傳到新的頁面;Response.Redirect則只能藉助URL中帶參數或是結合上面四種辦法把各種類型的值傳到新的頁面。
   
    繼續我們的Server.Transfer用法。

    (1)優點和缺點

    優點:
    1.直接在伺服器端重新導向,使用簡單方便,減少了用戶端對伺服器端提出請求。
    2.可以傳遞各種資料類型的值和控制項的值。

    缺點:
    1.用戶端瀏覽器中的URL地址是不改變,會導致在新的頁面可能出現一些意想不到的問題。比如如果源頁面和目的頁面不在同一個虛擬目錄或其子目錄下,那麼使用相對路徑的圖片、超連結都會導致錯誤的指向。[3]

    (2)使用方法

    1.在源頁面的代碼中,使用Page類的Server.Transfer跳到另一個頁面傳遞頁面資料:
    Server.Transfer("destinationWebForm.aspx","false")。

    2.在目的頁面中,使用Context.Handler來接收資料:
    FormerPage formerPage = (FormerPage)Context.Handler;
    然後用formerPage的屬性和方法來擷取前一個頁面的值,或者直接用
    Context.Items["myParameter "]
    來擷取前一個頁面的值。

    需要注意的是擷取這些值必須在新的頁面首次載入時,才能正確擷取上一頁面的各種資料類型或是控制項的值。在以後的postback時,就無法擷取上一頁面的各種資料類型或是控制項的值了,因為此時得到的當前頁面的執行個體. 所以需要在新頁面(destinationWebForm.aspx)的Page_Load()事件中使用if(!IsPostBack)把擷取前一個頁面的值的程式碼封裝含起來,才能獲得前一個頁面傳遞的各種資料類型的值、表單資料、QueryString。

    (3)應用舉例

    1.源頁面 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);//建立動態數組
    myList.Add("Hello,Array1! ");//向動態數組中添加新的值
    myList.Add("Hello,Array2!");
    myList.Add("Hello,Array3!");
    //Context可儲存任意資料類型,Context字典特定於某個Http請求。
    //對於不同用戶端,值是不一樣的。
    Context.Items["destinationList"] = myList;//在Context.Items中儲存動態數組

    Context.Items.Add("newContext","Hello,NewContext");//在Context.Items中儲存一組名稱-值的資料

    //Server.Transfer第二參數如果為true,表示本頁面的Form和QuerryString的值在新頁面繼續有效。
    //否則在新頁面無法獲得TextBox1的值。
    Server.Transfer("destinationWebForm.aspx?Name1="+ Name1Value,true);
   }

    2.目的頁面 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擷取對象,強制轉換類型:
      queryString = Request.QueryString["Name1"];//通過FormerPage的URL中的QueryString擷取值
     }
     catch
     {
      Response.Write("Error!");
     }            
    }
   }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.