分享

ASP.NET 高级编程基础第三篇—ViewState

 昵称10504424 2012-08-13

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     }
复制代码

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多