ASP.NET 進階編程基礎第三篇—ViewState

來源:互聯網
上載者:User

前言:前面兩篇讓我們先瞭解了ASP.NET的一些基礎知識,從這篇部落格開始講解我們在開發一個系統或者網站的時候用到的最多的技術,比如:如何合理的使用ViewState還有HTTP協議以及在ASP.NET中如何使用Session和cookie。下面就讓我們盡情的歡呼吧,說明一下,我的系列來自我現在正在學習的黑馬楊中科老師的講座

  1. ViewState初探

(1) Label版本的值存到了viewstate中,TextBox版本的不用存,因為TextBox就是input,自己就會提交給伺服器,不需要隱藏欄位。

(2) 用asp.net重寫Div文本自增(還要同時遞增Label的寬度,注意Width的單位是unit類型,不是簡單的int)。

Label.Text=((Convert.ToInt32(Label.Text)+1).ToString();

Label.Width=new unit(Label.Width.Value+10);

(3) 查看產生的原始碼,asp.net將所有隱藏的內容統一放到了名字為”_VIEWSTATE”的隱藏欄位中,使用序列化演算法將所有隱藏內容放到一個字串中,點擊按鈕幾次然後使用ViewStateDecoder這個工具查看viewstate內容,發現了確實將這些改變了的內容放到了viewstate中。

(4) 禁用ViewState的方法,enableviewstate=false,禁用viewstate以後textbox版本的不受任何的影響,Div版本的受影響,因為input的value不依靠ViewState。

(5) 回答ViewState原理的時候:說Input版本(TextBox自增和Div版本(Label)的不同)。

例如:建立一個Web項目,拖放一個TextBox控制項和按鈕控制項,將TextBox的值設定為0,點擊按鈕TextBox的值和寬度全部自增,在按鈕事件下面寫:

1   int i = Convert.ToInt32(TextBox1.Text);2 3      i++;4 5     TextBox1.Text = i.ToString();6 7     TextBox1.Width = new Unit(TextBox1.Width.Value + 10);

 

  1. 無狀態Http

(1) Http協議是沒有狀態的,不會記得上次和網頁”發生了什麼”,如果要知道上一次的狀態,一個方法是在對瀏覽器響應結束之前將狀態資訊儲存到頁面表單中,下次頁面再向伺服器發出請求的時候帶上這些狀態資訊,這樣伺服器就能根據這些狀態資訊還原上次的狀態了,伺服器不記得上次給了瀏覽器什麼,瀏覽器需要記住這些值(input就是記到value中,對於其他的值就要放到隱藏欄位中,比如:ViewState),下次再提交伺服器的時候(請在我的寬度基礎上增加10),就是把上次的值提交給伺服器,讓他想起來。

(2) 狀態資訊儲存到隱藏欄位中的缺點,加大網站的流量,降低訪問速度,機密資料放到表單中會有資料欺騙等安全性問題。

1   Response.Write("Label的值為:" + Label1.Text + "<br />"); //禁用了ViewState就讀不到上次給用戶端的值2 3      Label1.Text = "100";  //即使禁用ViewState,寫入瀏覽器的值不會受影響4 5      Response.Write("Label的值為" + Label1.Text + "<br />"); //及時禁用了viewstate,在請求沒有結束之前也能讀出來設定的值

 

  1. ASP.NET中使用Cookie

(1) 首先建立兩個Web頁面,Cookie1.aspx和Cookie2.aspx,第一個版面設定Cookie,第二個頁面讀取Cookie,在第一個頁面中放入TextBox和Button控制項,在第二個頁面中放入Label和Button控制項,在兩個頁面的Button時間下面寫如下代碼:

 1) 設定值的頁面

 

1    protected void Button1_Click(object sender, EventArgs e)2 3     {4 5         Response.SetCookie(new HttpCookie("Color", TextBox1.Text)); //在用戶端也能通過$.cookie取值,服務端設定Cookie6 7     }

 

 2) 讀取值的頁面

 

1     protected void Button1_Click(object sender, EventArgs e)2 3     {4 5         Label1.Text = Request.Cookies["Color"].Value; //服務端讀取Cookie6 7     }

 

(2) 表單是和頁面相關的,只有瀏覽器端提交了這些資料,伺服器端才能夠得到,而有時候希望在服務端任意的地方存放一些和訪問者相關的資訊,這時候就不方便將這些資訊儲存到表單了,因此如果那樣的話必須隨時注意在所有頁面表單中都儲存這些資訊,Cookie是和網站相關的,並且每次向伺服器請求的時候出了發送表單參數外,還會將和網站相關的所有Cookie都提交給伺服器,是強制性的Cookie也是儲存在瀏覽器端的,而且瀏覽器每次請求的時候都會把和這個網站相關的Cookie提交到伺服器,並且將伺服器端返回的Cookie更行會資料庫,因此可以將資訊儲存在Cookie中,然後在伺服器端讀取,修改,伺服器返回資料出了普通的Html資料以外,還會返回修改的Cookie,瀏覽器把拿到的Cookie值更新本地瀏覽器的Cookie就可以。

(3) 互連網最佳化的案例:圖片伺服器和主站網域名稱不一樣,降低Cookie流量的傳輸。

(4) Cookie的缺點和表單一樣,而且還不能儲存過多資訊

例如:全域變數和局部變數對頁面的影響

建立一個web頁面,拖放一個Label控制項和Button控制項

   

 1 private int i = 0; //每次請求來了都會new一個新的執行個體實現了IHttpHandel介面的類(變數1)的執行個體進行處理,用完了就記憶體回收,所以不會保持上次的數值 2  3     private static int j = 0;  //所有的訪問者都王文同一個執行個體 4  5     protected void Page_Load(object sender, EventArgs e) 6  7     { 8  9  10 11     }12 13     protected void Button2_Click(object sender, EventArgs e)14 15     {16 17         //i++;18 19         //Label1.Text = i.ToString();20 21         j++;22 23         Label1.Text = j.ToString();24 25     }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.