日期:2014-05-18  浏览次数:20442 次

关于ViewState的疑惑
viewstate不是可以用来保存状态的吗?启用控件的EnableViewState=true,那么该控件的值就不会因为刷新页面而丢失,是这样嘛?
如果是这样,那也就是说如果我不启用viewstate,设置控件的enableViewState = false,那刷新页面的时候这个控件值应该会丢失呀。
可是我不管启不启用控件的viewstate,刷新页面后的结果都是一样,控件值仍旧存在。

我实验时就放置了一个textbox和一个button.button的click事件没有具体内容。
然后当我运行这个页面的时候,在textbox里输入了123,单击按钮。不管我是否启用了viewstate,textbox中的值仍旧存在。

感觉是我对viewstate理解有误,请大家指正。

------解决方案--------------------
我简单描述一下:

当没有ViewState的时候,客户端post到服务器端时也是提交所有html标签的value属性值的,而这个值就被TextBox设置为Text属性。然后,当页面此次回发处理结束,TextBox输出为<input type="text" value="....." />的时候,这个value就又是你刚刚提交来的新值。然后你再次从客户端修改value并提交.....可见这个过程中从TextBox得到提交的Text值根本不需要ViewState。

那么ViewState有什么作用呢?当页面回发处理时,首先向TextBox恢复Text属性的ViewState值,然后才向Text属性写入提交的值。这个ViewState就是上一次页面输出时Text的“前一个”值,而不是本次由客户端提交的新值。这样,Text比较这两个值,如果不同则会触发TextChanged事件。(这个过程实际上是所有webControl都有的功能接口 IPostbackDataHnadler 定义的,TextBox 从它继承来了这个功能的)

TextBox只有Text属性是这样的。也就是说,当asp.net调用TextBox的 IPostbackDataHandler 接口的方法来处理客户端提交的value的时候,TextBox只会将value写到Text属性并判断是否需要过一会(Page_Load阶段处理结束之后)触发TextChanged事件,而并不会去影响TextBox的其它各种属性。