做爲一個ASP.Net程序員,尤爲是搞B/S開發的,對於不一樣頁面之間變量值的傳遞用的很是普遍,而掌握不一樣方式之間的區別和特色也就頗有必要。本文將針對這一知識點作一個簡單的總結。程序員
頁面之間傳值大體能夠分爲如下幾種:經過Get方式傳遞,經過Post方式傳遞,經過Session方式,經過Cookie方式和,經過Application方式,經過Cache方式,經過頁面屬性方式和經過靜態變量的方式。下面將對於以上幾種方式做一個對比:web
一、Get方式:經過Get方式在頁面之間傳值用的很是廣泛,用法也很是簡單,只需將須要傳遞的參數附在Url後邊便可,如:要訪問當前頁面,http://www.cnblogs.com/xsyblogs/admin/EditPosts.aspx?opt=1,咱們能夠看到在Url的最後,有一個「opt=1」的字樣,這即咱們要傳遞的參數。在當前頁面,若是咱們要獲取這個參數,只需經過Request.Querystring("opt")方法,便可獲取到傳遞的參數值。由於其是將參數附在Url中,因此其安全性也就可想而知了,可是對於像傳遞要獲取的頁碼,要獲取文章的ID這類參數很是有用。Get方式還有一個致命的缺陷就是最長只能傳遞255個字符,但對於簡單、少許的數據仍是很是有用。數據庫
二、Post方式:用的最多的除了Get也就是Post了,相對於Get而言,Post彷佛更安全,它經過將須要提交的數據封裝在隱藏域中,雖然稍微懂點開發的朋友都知道Post方式提交也能夠經過瀏覽器的開發工具來查看,但對於咱們平時使用來講,已經足夠了。若是須要經過Post方式提交數據,必須有name屬性,在服務端經過Request.Form("keyword")的方式獲取。Post方法適用於大數據,包括文件上傳。瀏覽器
對於Get方式和Post方式的區別在這裏稍微給出一個對比:見下圖。緩存
三、Session方式安全
Session方式也是很常見的一種保存頁面值的方法,它將用戶數據存儲在服務器端,將一個ID存放在客戶端做爲與服務端驗證的標記。咱們能夠把用戶名放在Session中,這樣就能經過判斷Session中某個key的值來判斷用戶是否登陸,登陸的話用戶名又是多少。Asp.Net中能夠設置Session的存儲方式,位置,SessionId的保存是否依賴於Cookie。Session的存儲有三種方式:服務器
Inproc(默認),Session存儲在IIS進程中。ide
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原理圖以下:
四、Application方式
將數據存儲於Application,至關於一個全局變量,整個站點數據共享,在整個應用程序的生命週期內都是有效的,適用於全部頁面,全部用戶共享的數據。其適用方法相似於Session,也是經過鍵值對的形式來取值和賦值。
五、Cookie方式
Cookie方式不失爲將數據保存在客戶端的經典方式。但因爲存儲在客戶端,其安全性低,受客戶端設置的限制。下面請看Cookie原理圖:
六、Cache方式
Cache在頁面傳值這裏用的不是太廣泛,但也有這方面的功能。Cache主要是將用戶數據存儲在服務器數據緩存中,能夠直接存儲對象,可是對數據的更新不及時。用法:Cache["username"]="xiaosy";
七、頁面屬性
這裏所說的頁面屬性是指利用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; }
獲取公共變量:
//發送的頁面 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;//獲取公共變量 }
另外還能夠經過如下這種方式獲取值:
//發送的頁面 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(); } }
八、靜態變量方式
靜態變量就是申明一個變量,而後賦值,而後在須要用的時候再取這個變量的值。在這裏就不舉例了。
九、ViewState
ViewState是Asp.Net特有的頁面保持機制,用來恢復頁面的狀態,無狀態的Http請求也由於有了ViewState的存在而變得有狀態。ViewState主要是將頁面各控件及其所存數據序列化存在name爲_ViewStated的隱藏域中。主要適用於頁面PostBack須要保存的數據,數據太大也會影響頁面發送效率。其原理圖以下: