ViewState:
之前讲过HttpHandler是无状态的,aspx是高级的HttpHandler,所以同样是
无状态的,在aspx.cs中一般也不要用类字段。那么如果确实需要存储一些页面
相关的变量怎么办呢?比如点击按钮“点击次数”加1。
示例:
在页面上放一个Button和一个Label,然后给Button添加一个事件,代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
object objNum = this.ViewState["num"];
if (objNum != null)
{
int num = Convert.ToInt32(objNum.ToString());
num++;
this.ViewState["num"] = num;
}
else
{
objNum = "1";
this.ViewState["num"] = objNum;
}
this.Label1.Text = objNum.ToString();
}
这样,每次点击按钮,Label1的文本都会加1。
什么原理?
查看页面的__VIEWSTATE,它是一个隐藏的input,使用ViewStateDecoder2.0.exe查看
input的value值,发现其中有“点击次数num”对应的值。每次页面渲染生成html的时候,
asp.net把ViewState中的值进行编码处理(Base64)序列化为__VIEWSTATE这样一个隐藏字段
放到html中,下次再次提交的时候把__VIEWSTATE的值提交,服务器把__VIEWSTATE的值反序列化
填充到ViewState属性中。其实就是把浏览器端当成“数据暂存”场所。
除了ViewState属性,还有哪些数据会放到__VIEWSTATE中?
所有在cs代码中修改的值,
比如给DataSource赋值的,比如Label的Text是没有放到__VIEWSTATE的,但是代码中
给Text属性赋值就会被放到__VIEWSTATE中了。所以__VIEWSTATE是用来盛放“本次修改的内容”
供“下次请求”还原现场使用,把Http模拟成了有状态。
禁用ViewState:
Repeater在绑定数据时,ASP.NET会在ViewState存放太多的内容,占用服务器很多的带宽资源,页面响应速度也慢。
ViewState是可以被禁用的(页面EnableViewState="false"),这样客户端只会保留基本的__VIEWSTATE。
控件单独设置EnableViewState=false,禁用控件的ViewState。
要想完全禁用ViewState要去掉form的runat=server,大部分服务器控件就都用不了了。
禁用原则:
什么时候可以禁用ViewState:当数据不需要“下次”使用的时候,就可以禁用。
先禁用,实在不行再启用。没有非要ViewState才能干成的事。
转载自:传智播客