ASP.NET 高級(jí)編程基礎(chǔ)第三篇—ViewState前言:前面兩篇讓我們先了解了ASP.NET的一些基礎(chǔ)知識(shí),從這篇博客開(kāi)始講解我們?cè)陂_(kāi)發(fā)一個(gè)系統(tǒng)或者網(wǎng)站的時(shí)候用到的最多的技術(shù),比如:如何合理的使用ViewState還有HTTP協(xié)議以及在ASP.NET中如何使用Session和cookie。下面就讓我們盡情的歡呼吧,說(shuō)明一下,我的系列來(lái)自我現(xiàn)在正在學(xué)習(xí)的黑馬楊中科老師的講座
(1) Label版本的值存到了viewstate中,TextBox版本的不用存,因?yàn)門(mén)extBox就是input,自己就會(huì)提交給服務(wù)器,不需要隱藏字段。 (2) 用asp.net重寫(xiě)Div文本自增(還要同時(shí)遞增Label的寬度,注意Width的單位是unit類(lèi)型,不是簡(jiǎn)單的int)。 Label.Text=((Convert.ToInt32(Label.Text)+1).ToString(); Label.Width=new unit(Label.Width.Value+10); (3) 查看生成的源代碼,asp.net將所有隱藏的內(nèi)容統(tǒng)一放到了名字為”_VIEWSTATE”的隱藏字段中,使用序列化算法將所有隱藏內(nèi)容放到一個(gè)字符串中,點(diǎn)擊按鈕幾次然后使用ViewStateDecoder這個(gè)工具查看viewstate內(nèi)容,發(fā)現(xiàn)了確實(shí)將這些改變了的內(nèi)容放到了viewstate中。 (4) 禁用ViewState的方法,enableviewstate=false,禁用viewstate以后textbox版本的不受任何的影響,Div版本的受影響,因?yàn)閕nput的value不依靠ViewState。 (5) 回答ViewState原理的時(shí)候:說(shuō)Input版本(TextBox自增和Div版本(Label)的不同)。 例如:新建一個(gè)Web項(xiàng)目,拖放一個(gè)TextBox控件和按鈕控件,將TextBox的值設(shè)置為0,點(diǎn)擊按鈕TextBox的值和寬度全部自增,在按鈕事件下面寫(xiě): 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協(xié)議是沒(méi)有狀態(tài)的,不會(huì)記得上次和網(wǎng)頁(yè)”發(fā)生了什么”,如果要知道上一次的狀態(tài),一個(gè)方法是在對(duì)瀏覽器響應(yīng)結(jié)束之前將狀態(tài)信息保存到頁(yè)面表單中,下次頁(yè)面再向服務(wù)器發(fā)出請(qǐng)求的時(shí)候帶上這些狀態(tài)信息,這樣服務(wù)器就能根據(jù)這些狀態(tài)信息還原上次的狀態(tài)了,服務(wù)器不記得上次給了瀏覽器什么,瀏覽器需要記住這些值(input就是記到value中,對(duì)于其他的值就要放到隱藏字段中,比如:ViewState),下次再提交服務(wù)器的時(shí)候(請(qǐng)?jiān)谖业膶挾然A(chǔ)上增加10),就是把上次的值提交給服務(wù)器,讓他想起來(lái)。 (2) 狀態(tài)信息保存到隱藏字段中的缺點(diǎn),加大網(wǎng)站的流量,降低訪問(wèn)速度,機(jī)密數(shù)據(jù)放到表單中會(huì)有數(shù)據(jù)欺騙等安全性問(wèn)題。 1 Response.Write("Label的值為:" + Label1.Text + "<br />"); //禁用了ViewState就讀不到上次給客戶(hù)端的值 2 3 Label1.Text = "100"; //即使禁用ViewState,寫(xiě)入瀏覽器的值不會(huì)受影響 4 5 Response.Write("Label的值為" + Label1.Text + "<br />"); //及時(shí)禁用了viewstate,在請(qǐng)求沒(méi)有結(jié)束之前也能讀出來(lái)設(shè)置的值
(1) 首先新建兩個(gè)Web頁(yè)面,Cookie1.aspx和Cookie2.aspx,第一個(gè)頁(yè)面設(shè)置Cookie,第二個(gè)頁(yè)面讀取Cookie,在第一個(gè)頁(yè)面中放入TextBox和Button控件,在第二個(gè)頁(yè)面中放入Label和Button控件,在兩個(gè)頁(yè)面的Button時(shí)間下面寫(xiě)如下代碼: 1) 設(shè)置值的頁(yè)面
1 protected void Button1_Click(object sender, EventArgs e) 2 3 { 4 5 Response.SetCookie(new HttpCookie("Color", TextBox1.Text)); //在客戶(hù)端也能通過(guò)$.cookie取值,服務(wù)端設(shè)置Cookie 6 7 }
2) 讀取值的頁(yè)面
1 protected void Button1_Click(object sender, EventArgs e) 2 3 { 4 5 Label1.Text = Request.Cookies["Color"].Value; //服務(wù)端讀取Cookie 6 7 }
(2) 表單是和頁(yè)面相關(guān)的,只有瀏覽器端提交了這些數(shù)據(jù),服務(wù)器端才能夠得到,而有時(shí)候希望在服務(wù)端任意的地方存放一些和訪問(wèn)者相關(guān)的信息,這時(shí)候就不方便將這些信息保存到表單了,因此如果那樣的話必須隨時(shí)注意在所有頁(yè)面表單中都保存這些信息,Cookie是和站點(diǎn)相關(guān)的,并且每次向服務(wù)器請(qǐng)求的時(shí)候出了發(fā)送表單參數(shù)外,還會(huì)將和站點(diǎn)相關(guān)的所有Cookie都提交給服務(wù)器,是強(qiáng)制性的Cookie也是保存在瀏覽器端的,而且瀏覽器每次請(qǐng)求的時(shí)候都會(huì)把和這個(gè)站點(diǎn)相關(guān)的Cookie提交到服務(wù)器,并且將服務(wù)器端返回的Cookie更行會(huì)數(shù)據(jù)庫(kù),因此可以將信息保存在Cookie中,然后在服務(wù)器端讀取,修改,服務(wù)器返回?cái)?shù)據(jù)出了普通的Html數(shù)據(jù)以外,還會(huì)返回修改的Cookie,瀏覽器把拿到的Cookie值更新本地瀏覽器的Cookie就可以。 (3) 互聯(lián)網(wǎng)優(yōu)化的案例:圖片服務(wù)器和主站域名不一樣,降低Cookie流量的傳輸。 (4) Cookie的缺點(diǎn)和表單一樣,而且還不能存儲(chǔ)過(guò)多信息 例如:全局變量和局部變量對(duì)頁(yè)面的影響 新建一個(gè)web頁(yè)面,拖放一個(gè)Label控件和Button控件
1 private int i = 0; //每次請(qǐng)求來(lái)了都會(huì)new一個(gè)新的實(shí)例實(shí)現(xiàn)了IHttpHandel接口的類(lèi)(變量1)的實(shí)例進(jìn)行處理,用完了就垃圾回收,所以不會(huì)保持上次的數(shù)值 2 3 private static int j = 0; //所有的訪問(wèn)者都王文同一個(gè)實(shí)例 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 }
|
|
來(lái)自: 昵稱(chēng)10504424 > 《C#》