ASP.Net頁面傳值比較


     作為一個ASP.Net程序員,尤其是搞B/S開發的,對於不同頁面之間變量值的傳遞用的非常廣泛,而掌握不同方式之間的區別和特點也就很有必要。本文將針對這一知識點做一個簡單的總結。

      頁面之間傳值大致可以分為以下幾種:通過Get方式傳遞,通過Post方式傳遞,通過Session方式,通過Cookie方式和,通過Application方式,通過Cache方式,通過頁面屬性方式和通過靜態變量的方式。下面將對於以上幾種方式作一個對比:

      1、Get方式:通過Get方式在頁面之間傳值用的非常普遍,用法也非常簡單,只需將需要傳遞的參數附在Url后邊即可,如:要訪問當前頁面,http://www.cnblogs.com/xsyblogs/admin/EditPosts.aspx?opt=1,我們可以看到在Url的最后,有一個“opt=1”的字樣,這即我們要傳遞的參數。在當前頁面,如果我們要獲取這個參數,只需通過Request.Querystring("opt")方法,即可獲取到傳遞的參數值。因為其是將參數附在Url中,所以其安全性也就可想而知了,但是對於像傳遞要獲取的頁碼,要獲取文章的ID這類參數非常有用。Get方式還有一個致命的缺陷就是最長只能傳遞255個字符,但對於簡單、少量的數據還是非常有用。

    2、Post方式:用的最多的除了Get也就是Post了,相對於Get而言,Post似乎更安全,它通過將需要提交的數據封裝在隱藏域中,雖然稍微懂點開發的朋友都知道Post方式提交也可以通過瀏覽器的開發工具來查看,但對於我們平時使用來說,已經足夠了。如果需要通過Post方式提交數據,必須有name屬性,在服務端通過Request.Form("keyword")的方式獲取。Post方法適用於大數據,包括文件上傳。

        對於Get方式和Post方式的區別在這里稍微給出一個對比:見下圖。

   3、Session方式

      Session方式也是很常見的一種保存頁面值的方法,它將用戶數據存儲在服務器端,將一個ID存放在客戶端作為與服務端驗證的標記。我們可以把用戶名放在Session中,這樣就能通過判斷Session中某個key的值來判斷用戶是否登錄,登錄的話用戶名又是多少。Asp.Net中可以設置Session的存儲方式,位置,SessionId的保存是否依賴於Cookie。Session的存儲有三種方式:

     Inproc(默認),Session存儲在IIS進程中。

     StateServer,Session存儲在獨立的Windows服務進程中(可以不是Web服務器)。

     SqlServer,Session存儲在SqlServer數據庫的表中(SqlServer服務器)。 

      雖然InProc模式的Session直接存儲在Web服務器IIS進程中,速度比較快,但是每次重新啟動IIS都會導致Session丟失。利用后兩種模式,我們就完全可以把Session從Web服務器中獨立出來,從而減輕Web服務器的壓力,同時減少Session丟失的概率。 

      因此,SessionID存儲在客戶端(可以是Cookie或者URL),其他都存儲在服務端(可以是IIS進程、獨立的Windows服務進程或者SQL Server數據庫中)。

      Session原理圖如下:

      

   4、Application方式

         將數據存儲於Application,相當於一個全局變量,整個站點數據共享,在整個應用程序的生命周期內都是有效的,適用於所有頁面,所有用戶共享的數據。其適用方法類似於Session,也是通過鍵值對的形式來取值和賦值。

   5、Cookie方式

      Cookie方式不失為將數據保存在客戶端的經典方式。但由於存儲在客戶端,其安全性低,受客戶端設置的限制。下面請看Cookie原理圖:

   6、Cache方式

      Cache在頁面傳值這里用的不是太普遍,但也有這方面的功能。Cache主要是將用戶數據存儲在服務器數據緩存中,可以直接存儲對象,但是對數據的更新不及時。用法:Cache["username"]="xiaosy";

   7、頁面屬性

       這里所說的頁面屬性是指利用HttpContext獲取發請求的頁面的信息。我們常說頁面類對象,既然通過HttpContext把這個頁面類對象都拿到了,又何愁拿不到里面的變量呢?但是通過這種方式有一點要注意,就是強制轉換類型一定要正確,不然就啥也拿不到哦。這里舉兩個例子:

      獲取控件的值: 

//發送頁面
 <input type="button" id="generateThum" value="生成"/>
    <asp:TextBox ID="txtBox1" runat="Server" Text="xiaosy"></asp:TextBox>
    <asp:Button runat="server" ID="btnButton" Text="去別的頁面" OnClick="btnButton_Click"/>

 protected void btnButton_Click(object sender, EventArgs e)
        {
            Server.Transfer("WebForm2.aspx");
        }
//接收頁面
<asp:Label runat="server" ID="label1"></asp:Label>

protected void Page_Load(object sender, EventArgs e)
        {
            WebForm1 webForm1 =(WebForm1)Context.Handler;
            label1.Text = ((TextBox)webForm1.FindControl("txtBox1")).Text;
        }
View Code

      獲取公共變量: 

//發送的頁面
  public string userName = "xiaosy";
        protected void btnButton_Click(object sender, EventArgs e)
        {
            Server.Transfer("WebForm2.aspx");
        }
//接收的頁面
 if (Context.Handler is WebForm1)
            {
                WebForm1 webForm1 = (WebForm1)Context.Handler;
                this.label1.Text = webForm1.userName;//獲取公共變量
            }
View Code 

     另外還可以通過以下這種方式獲取值:  

//發送的頁面
protected void btnButton_Click(object sender, EventArgs e)
        {
            Context.Items["name"] = txtBox1.Text;
            Server.Transfer("WebForm2.aspx");
        }
//接收的頁面
 protected void Page_Load(object sender, EventArgs e)
        {
            if (Context.Handler is WebForm1)
            {
                this.label1.Text = Context.Items["name"].ToString();
            }
           
        }
View Code

   8、靜態變量方式

       靜態變量就是申明一個變量,然后賦值,然后在需要用的時候再取這個變量的值。在這里就不舉例了。

   9、ViewState

       ViewState是Asp.Net特有的頁面保持機制,用來恢復頁面的狀態,無狀態的Http請求也因為有了ViewState的存在而變得有狀態。ViewState主要是將頁面各控件及其所存數據序列化存在name為_ViewStated的隱藏域中。主要適用於頁面PostBack需要保存的數據,數據太大也會影響頁面發送效率。其原理圖如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM