天天看點

webform 頁面傳值的方法總結

  頁面傳值是學習asp.net初期都會面臨的一個問題,總的來說有頁面傳值、存儲對象傳值、ajax、類、model、表單等。但是一般來說,常用的較簡單有QueryString,Session,Cookies,Application,Server.Transfer。

  一、QueryString

  QueryString是一種非常簡單的傳值方式,他可以将傳送的值顯示在浏覽器的位址欄中。如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時,可以使用這個方法。但是對于傳遞數組或對象的話,就不能用這個方法了。

  這種方法的優點:1.使用簡單,對于安全性要求不高時傳遞數字或是文本值非常有效。

  這種方法的缺點:1.缺乏安全性,由于它的值暴露在浏覽器的URL位址中的。

          2.不能傳遞對象。

  使用方法:1.在源頁面的代碼中用需要傳遞的名稱和值構造URL位址。

       2.在源頁面的代碼用Response.Redirect(URL);重定向到上面的URL位址中。

       3.在目的頁面的代碼使用Request.QueryString["name"];取出URL位址中傳遞的值。

  例子:(1)a.aspx

  (2)b.aspx

  二、Session

  想必這個肯定是大家使用中最常見的用法了,其操作與Application類似,作用于使用者個人,是以,過量的存儲會導緻伺服器記憶體資源的耗盡。

  優點:1.使用簡單,不僅能傳遞簡單資料類型,還能傳遞對象。

     2.資料量大小是不限制的。

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

     2.容易丢失。

  使用方法:1.在源頁面的代碼中建立你需要傳遞的名稱和值構造Session變量:Session["Name"]="Value(Or Object)";

       2.在目的頁面的代碼使用Session變量取出傳遞的值。Result = Session["Nmae"]

  注意:session不用時可以銷毀它,銷毀的方法是:清除一個:Session.Remove("session名");

                         清除所有:Session.Clear();

  三、Cookie

  這個也是大家常使用的方法,Cookie用于在使用者浏覽器上存儲小塊的資訊,儲存使用者的相關資訊,比如使用者通路某網站時使用者的ID,使用者的偏好等,使用者下次通路就可以通過檢索獲得以前的資訊。是以Cookie也可以在頁面間傳遞值。Cookie通過HTTP頭在浏覽器和伺服器之間來回傳遞的。Cookie隻能包含字元串的值,如果想在Cookie存儲整數值,那麼需要先轉換為字元串的形式。

  與Session一樣,其是什對每一個使用者而言的,但是有個本質的差別,即Cookie是存放在用戶端的,而session是存放在伺服器端的。而且Cookie的使用要配合ASP.NET内置對象Request來使用。

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

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

     2.安全性不高,容易僞造。

  

  使用方法:1.在源頁面的代碼中建立你需要傳遞的名稱和值構造Cookie對象:

      2.在目的頁面的代碼使用Cookie對象取出傳遞的值:Result = Request.Cookies[ "myCookie" ].Value;

  四、Application

  Application對象的作用範圍是整個全局,也就是說對所有使用者都有效。它在整個應用程式生命周期中都是有效的,類似于使用全局變量一樣,是以可以在不同頁面中對它進行存取。它和Session變量的差別在于,前者是所有的使用者共用的全局變量,後者是各個使用者獨有的全局變量。

  可能有人會問,既然所有使用者都可以使用application變量,那他可以用在什麼場合呢?這裡舉個例子:網站通路數。多個請求通路時都可以對它進行操作。

  優點:1.使用簡單,消耗較少的伺服器資源。

     2.不僅能傳遞簡單資料,還能傳遞對象。

     3.資料量大小是不限制的。

  缺點:1.作為全局變量容易被誤操作。是以單個使用者使用的變量一般不能用application。

  使用方法:1.在源頁面的代碼中建立你需要傳遞的名稱和值構造Application變量:Application["Nmae"]="Value(Or Object)";

       2.在目的頁面的代碼使用Application變量取出傳遞的值。Result = Application["Nmae"]

  注意:常用lock和unlock方法用來鎖定和解鎖,為了防止并發修改。

webform 頁面傳值的方法總結
webform 頁面傳值的方法總結
webform 頁面傳值的方法總結
webform 頁面傳值的方法總結

  五、Server.Transfer

  這個才可以說是面象對象開發所使用的方法,其使用Server.Transfer方法把流程從目前頁面引導到另一個頁面中,新的頁面使用前一個頁面的應答流,是以這個方法是完全面象對象的,簡潔有效。

  Server.Transfer是從目前的ASPX頁面轉到新的ASPX頁面,伺服器端執行新頁并輸出,在新頁面中通過Context.Handler來獲得前一個頁面傳遞的各種資料類型的值、表單資料、QueryString.由于重定向完全在伺服器端完成,是以用戶端浏覽器中的URL位址是不會改變的。調用Server.Transfer時,目前的ASPX頁面終止執行,執行流程轉入另一個ASPX頁面,但新的ASPX頁面仍使用前一ASPX頁面建立的應答流。

  ps:比較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中帶參數或是結合上面四種辦法把各種類型的值傳到新的頁面。

  優點:1.直接在伺服器端重定向,使用簡單友善,減少了用戶端對伺服器端提出請求。

     2.可以傳遞各種資料類型的值和控件的值。

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

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

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

webform 頁面傳值的方法總結
webform 頁面傳值的方法總結
webform 頁面傳值的方法總結
webform 頁面傳值的方法總結

    (2)b.aspx

webform 頁面傳值的方法總結
webform 頁面傳值的方法總結
webform 頁面傳值的方法總結
webform 頁面傳值的方法總結

  以上就是常用的幾種頁面間傳值的方法,我一般使用session和querystring來傳值,少數情況會使用到cookie。本篇文章僅僅是介紹這幾種方法的使用方法,内部原理沒有過多的解釋,關于session的存儲方式請參見:​​session的存儲方式和配置​​

  參考文章:1、​​ASP.NET頁面之間傳遞值的幾種方式​​

       2、​​ASP.NET頁面之間傳遞值的幾種方法​​

接下來再補充幾個。。。。

Each button in the demo has the required code in it's Click event handler, and brings you to a separate target page that gets and displays the data that was sent. Here are the methods:

1. Use the querystring:

protected void QueryStringButton_Click(object sender, EventArgs e)

         {

             Response.Redirect("QueryStringPage.aspx?Data=" + Server.UrlEncode(DataToSendTextBox.Text));

        }

2. Use HTTP POST:

<asp:Button ID="HttpPostButton" runat="server" Text="Use HttpPost"

             PostBackUrl="~/HttpPostPage.aspx" onclick="HttpPostButton_Click"/>

protected void HttpPostButton_Click(object sender, EventArgs e)

        {

     // The PostBackUrl property of the Button takes care of where to send it!

  3. Use Session State:

   protected void SessionStateButton_Click(object sender, EventArgs e)

             Session["Data"] = DataToSendTextBox.Text;

             Response.Redirect("SessionStatePage.aspx");

  4.  Use public properties:

   public string DataToSend

            get

            {

                 return DataToSendTextBox.Text;

             }

        protected void PublicPropertiesButton_Click(object sender, EventArgs e)

         {

             Server.Transfer("PublicPropertiesPage.aspx");

5. Use PreviousPage Control Info:

protected void ControlInfoButton_Click(object sender, EventArgs e)

             Server.Transfer("ControlInfoPage.aspx");

  // target page:

protected void Page_Load(object sender, EventArgs e)

            var textbox = PreviousPage.FindControl("DataToSendTextbox") as TextBox;

             if (textbox != null)

                DataReceivedLabel.Text = textbox.Text;

            }

6. Use HttpContext Items Collection:

  protected void HttpContextButton_Click(object sender, EventArgs e)

             HttpContext.Current.Items["data"] = DataToSendTextBox.Text;

             Server.Transfer("HttpContextItemsPage.aspx");

// target page:

         {

             this.DataReceivedLabel.Text =(String) HttpContext.Current.Items["data"];

7. Use Cookies:

protected void CookiesButton_Click(object sender, EventArgs e)

            HttpCookie cook =  new HttpCookie("data");

            cook.Expires = DateTime.Now.AddDays(1);

            cook.Value = DataToSendTextBox.Text;

             Response.Cookies.Add(cook);

             Response.Redirect("HttpCookiePage.aspx");

            DataReceivedLabel.Text = Request.Cookies["data"].Value;

8. Use Cache:

protected void CacheButton_Click(object sender, EventArgs e)

         {

             Cache["data"] = DataToSendTextBox.Text;

             Server.Transfer("CachePage.aspx");

   // target page:

    protected void Page_Load(object sender, EventArgs e)

             this.DataReceivedLabel.Text = (string) Cache["data"];

Actually, there are a number of other methods. You can use a database, a Data Store such as Redis or BPlusTree, file storage, or even the Appdomain Cache. But as these are not as common, we'll leave those as an exercise for the reader. I should mention that the use of Cache and Application (not shown) are not user - specific, but they can easily be made so by prepending the key used with something unique to the user such as their SessionId. 

You can download the complete Visual Studio 2010 demo solution here.