大多数ASP.NET 服务器控件存储其属性值得方式是通过ViewState的方式存储的。
StateBag还具有对其中数据更改的跟踪过程(Tracking ability)。是否进行跟踪的开关可以被设置成开或者关,当调用StateBag.TrackViewState()方法后跟踪开关将被开启。
如果是默认的方式,那么VIewState中的值会被序列化成一个基于Base64编码的字符串,然后存储在页面 中一个叫做_ViewState的隐藏变量中。
首先页面回传以后,整个Page将重新生成并且那些页面上声明的静态控件也都已经被解析添加到 以Page为根节点的控件树中,那些静态控件对应的静态声明的属性值也都被初始化。然后是OnInit阶段,在这个阶段ASP.NET会调用 TrackViewState方法,从此以后所有对控件属性的赋值操作都将导致被跟踪。接着就LoadViewState()方法被调用,这里那些从_ViewState中反序列化出来的值将被重新赋给对应的控件,由于在此之前TrackViewState()已经被调用了,_ViewState中包 含的数据对应的属性值都会被标记为Dirty。这样当调用SaveViewState的时候,这些属性值还是会被持久的保留到_ViewState中,这 样在页面的一次次回传和页面一次次的重新建立的过程中,这些控件的值就被保留下来了。
ASP.NET视图状态的第一个规则是,只有在你拥有其值是通过代码动态生成的部件的时候,才能实现视图状态效果。如果在*.aspx文件的<form>标签内硬编码值,这些项的状态总是通过回传来保存。即使通过给页面设定禁用视图。
我在Repeater里面使用了一个没有被绑定的TextBox.没有对它进行数据绑定,所以如果给Repeater指定数据源绑定之后,Textbox原来的值就会消失。好像不存在ViewState一样,需要自己另外保存。