ASP.NET中 对于"__ViewState"的一些小思考

我是初学者,可能好些东西都是人尽皆知的了,只是我的一个小总结吧,说得不对的地方也敬请大家批评指正:)

1、只有form表单在标识 runat="server" 的时候,才会自动生成 _viewstate 这个隐藏域(反射器中可以看到详细的生成过程,暂时没去看..)

2、标识了runat="server" 的form,默认使用post方法提交而HTML中默认的是get方法,这里调整为post方法一定有其优化的思路在里面(暂时未整理)

3、标识了runat="server" 的form,post默认是提交到其本身,即action默认为当前页面

4、因为以上原因,所以在cs代码中,默认情况下,只有当ispostback为true的时候,才可能得到form中自动生成的隐藏域 _ _ viewstate

5、但是这个隐藏域也只是普通的隐藏域,如果声明method为get方法时,第二次get(提交form时)同样可以在url中看到这个viewstate的value

6、viewstate保存的是object对象,但其默认实现的功能中,只保存不能自动post的页面元素,以保持页面状态:

  不保存的有:非表单元素、表单元素中的非单值内容(这里不再区分html标签或服务器控件)

  保存的有:单值表单元素、非单值表单中的选定项

  其实不用记上面这些东西,简单地说就是只保存不能提交上来的东东,因为提交过来的内容(包括单值表单元素,以及什么单选、多选按钮中的选定项,以及name重名项,同一name多个值,会以逗号隔开),服务器是可以接收到的,便可以将这些内容通过回写浏览器保存状态,因此不必再在viewstate中再进行一次读写(浪费资源)。

7、viewstate保存页面元素是通过 序列化->字节数组->base64编码字符串 的方式以树形结构保存页面内容,响应时再通过 解码-字节数组-反序列化的方式复原页面,当需要通过viewstate保持状态的内容过多时(如datagridview,服务器端控件、不是表单元素),viewstate会加大网络传输流量,并不是太好的解决方法。

8、viewstate就是在用户页面上建个变量(必然会提交的变量)把所有用户原本不提交的东西都存里面,这样用户提交时就把一切都告诉服务器了,服务器就可以根据需要复原提交页面前的任何展示.

你可能感兴趣的:(asp.net)