首页->文章内容
input type=hidden id=__VIEWSTATE是什么意思
[编辑:zxd] [点击:1720] [回应:0] [上传时间:2018-6-6 13:21:27]


blob.png


这个是通过编译后自动生成的代码,你一定是直接打开下载了生成网站之后的源代码了,这样是看不到真正的服务器控件的。一定要去下载在FTP服务器上的而且没有被编译过的源代码(编译过的源代码可以正常运行,当看不到.CS文件)

由于HTTP连接属于无状态的,每次页面请求都无法记录上次请求页面的信息。

<%@ Page Language="C#"  EnableViewState="false" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %>  在顶部中加入 EnableViewState="false" ,也可以在单个控件上面加上enableviewstate="false",就可以去掉了,前提是你用不到它,


那么要保存上次请求页面上控件的值,也就是页面刷新后,填写的值不变,比方在textbox填了个‘a’,页面刷新后还是'a',.NET框架为实现这种机制,于是就用到了viewstate视图状态来保存这些控件的值,

那么将所有控件的值存在什么地方呢?也就是你看见的进过序列化后都存在隐藏域里input type="hidden" name="__VIEWSTATE",然后服务器接收后会反序列化这些隐藏域的值然后又从新给这些控件赋值,从而页面刷新后还能记录上次请求时候的所有控件的值。

以上为基本原理。

现在搞点实际的,VIEWSTATE是个极其浪费性能的东西,因为每次都要反序列化与序列化,如果你的VIEWSTATE保存了太多的值,那么将导致网页速度载入过慢,所以你的网站网页打开超费劲。

这个时候该怎么办?

一:关闭VIEWSTATE视图状态,每个服务器控件都会有个

EnableViewState的属性,这个属性也就是是否要使用视图状态记录值

设置为true为记录,设置为false不记录,可以做个测试放个textbox设置为EnableViewState为false,然后输入个值,然后再用按钮去刷新页面,那么textbox又会为空。这个时候可以将页面上刷新后不需要记录状态的都设置为flase,比方通常的查询,每次查询都需要重新绑定数据,这个时候可以设为false来提高性能,这也就是大家常说用来显示数据的控件,都很喜欢用repeater而不用gridview或datagrid,因为repeater不会输出过多的VIEWSTATE,完全自己手写代码,而gridview将产生大量的VIEWSTATE,虽然封装的很好,用起来很方便,有得必用失,极其浪费性能,自己做个测试查看源文件对比下VIEWSTATE就晓得了。

二:通过压缩工具对VIEWSTATE进行压缩,有的地方也没办法,一定要用到VIEWSTATE,那么也只能去压缩他了。



乐 排 行 板 . 版 权 所 有

京ICP备12001047号-3