ASP.NET 高級編程基礎第三篇—ViewState


前言:前面兩篇讓我們先了解了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取值,服務端設置Cookie
6 
7     }

 

 2) 讀取值的頁面

 

1     protected void Button1_Click(object sender, EventArgs e)
2 
3     {
4 
5         Label1.Text = Request.Cookies["Color"].Value; //服務端讀取Cookie
6 
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     }

 


免責聲明!

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



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