听说ViewState是保存页面一些信息的,可是我还是有些不明白??
1.像GridView中的数据是否也是保存在ViewState中的,如果是像那种一次取出很多的,然后有很多页的是否都保存在其中,那么当选择选择下一页它是再去操作数据库还是进行其他的操作?2.那种注册的时候,填写完成跳到一个其它页时,然后点后退时,原先填的信息还在,这是为什么,不是页面不保存在服务器的吗,为什么后退时还有?回传给同一个页面还好理解,跳其他页又返回就不清楚了3.像this.PreviousPage.Find("txtname").Text;这个是怎么实现的,它是用什么来取得那个数值的,它怎么会取到的啊,不是不保存页面吗?

解决方案 »

  1.   

    那么当选择选择下一页它是再去操作数据库还是进行其他的操作? 当你绑定GridView时候,数据已经从数据库中取到了,可能根据你选择不同的数据而存在不同的地方,不过都不是在数据库中比如DataSet  DataTable HashTable  Datareader等等,之后就是对这些数据集的操作了
      

  2.   

    1 GridView数据可以保存在ViewState
    2 . 我也不清楚到底是什么原因 - - 我估计是网页数据存放在一个缓存中 所以后退还有数据
    3.. 不知道
      

  3.   

    1.只针对能保存内存数据的数据源,如dataset
    2.原理应该是同与history.go(-1),有cookie来保存数据(猜测).
    3.this.PreviousPage.Find("txtname").Text类似与getElementById的操作
      

  4.   

    3楼的帅哥
     我现在有个想法 是否可以将整个页面存进缓存中, 再存放在viewstate, 然后再viewstate从获取需要的内容
      

  5.   

    三楼的那个说:
    this.PreviousPage.Find("txtname").Text类似与getElementById的操作
    可我问的是为什么还会取得上一页的那个值啊,那个值存哪里的啊?
      

  6.   

    GridView的EnableViewState 属性设置为False 禁用了ViewState
    再看一下取不取得到值,取不到就说明东西是存在ViewState里的(个人认为,不一定对)
      

  7.   

    既然存在ViewState中,那我执行GridView的下一页操作,它是去执行什么的,或者这期间在哪里做了这个操作,是将存在ViewState中的数据进行下一页操作吗???
      

  8.   

    好贴
    1 :不可能全存在ViewState 中,而且datatable  在页面rend 完了后就不存在了
        重新点下一页只是重新从数据库取再邦定的过程
    2 :真的是跳转到其他页面了吗?就一个页面,只是不同情况不同的显示吧了,如果是跳转到其他页面是保存不了值的,类似.response.redrict();
    3 : 不晓得,没用过。
      

  9.   

    2.实际上是IE的一种机制,他是把你的前面的一些数据保存到内存中,后退的时候直接去取的数据。IE关闭之后,
      也就把这个这个数据给清楚了。
    3.是取的页面提交之后,Request会把你提交的页面传输到服务器去,再对回传的数据来处理等到的数据。
      

  10.   


    1. 没有直接保存值,它只是保存控件的状态。GridView保存了所有你定义的Column结构、所有的样式等等,自身几十个信息,但是并不直接保存数据。不过,例如你在模板中使用了一个DropdownList来设计界面,当GridView保存这个列的ViewState时候,就会保存这个模板的ViewState,而保存这个模板的ViewState就会保存模板中控件的ViewState,也就会保存DropdownList的ViewState,因此保存GridView的ViewState的时候也就会保存这个DropdownList的各种状态值,其中就包括了这个DropdownList的Items中的所有值(DropdownList还有很多其他的状态,例如ForColor等也都保存在ViewState中)。因此,GridView并没有直接保存值,但是如果值已经被化身为内部控件的某个状态,也就被ViewState保存了。可以说,一个GridView的ViewState可能保存几千甚至上万个状态值,你所说的数据值如果作为控件状态就会被保存,但是只是占GridView的ViewState数据的一部分而已。
    2. 页面上总是有信息保存ViewState的。默认的asp.net页面,你从客户端“源文件”上可以看到 __ViewState 这个隐藏域。它在浏览器上毫无用处,页面显示时服务器把它写到浏览器端,当页面回发时(HTTP POST)再跟其它数据一样提交回服务器。它在浏览器与服务器之间丢来丢去。如果把它保存在服务器端并不输出,那么在 __ViewState 中也要有服务器端ViewState的保存对象的一个索引信息。因此,如果“重新”提交前边操作过的某个页面的 HTTP Post 数据,一定包含前边那个页面的ViewState信息。
    3. 在页面a进行提交时,提交的数据集合可能提交给a页面,也可能提交给b页面。提交到b页面时,如果在服务器端创建a页面实例,并且把这个数据集合再提交给这个a页面实例,这就相当于b和a两个页面的两个实例分别得到了提交的数据集合。当指令this.PreviousPage执行时,就是这样从b页面又得到了一个a页面实例。
      

  11.   

    从1. 你可以推论出,你执行那个“下一页”操作的时候,此时才应该读取数据库。而页面回发时,无需读取数据库,而且也不应该读取数据库来破坏ViewState所已经准备好的东西。
      

  12.   

    对于2.,浏览器上的“退回”操作是直接重复以前的Http命令,即重新提交前边的操作数据。而在地址栏直接输入某个页面,则是Http Get命令,并没有提交任何ViewState,此时页面没有得到ViewState,此时后台就会判断 IsPostback 为 false。实际上,除了后台要判断是否存在页面状态,还要判断是否有触发控件的id参数,这两个值都没有则 IsPostback 为 false。
      

  13.   

    例如数据库记录中一个字段值被绑定到Grid的两个列上,一列使用Label或者TextBox并且绑定Text,另一列是Image并且绑定ImageUrl。在当前页面上一共显示了30条记录。那么在GridView的状态中就有这30个Label或者TextBox控件的Text属性,以及另外30个Image的ImageUrl属性值。如果你还在Label的ForColor属性绑定另外一个字段值(通过值计算出应该显示的颜色),那么还有不超过30个Label的ForColor属性在GridView的状态集合内部。如果你在页面上放一个回发的按钮进行测试,你可以看到当回发时这些控件的状态(Text、ForColor、ImageUrl)都自动恢复以前页面的值,无需你读取数据库重新设置。除非你把某个控件的EnableViewState给禁止掉了。可见,GridView保存当前可显示控件的所有状态,与数据值并不直接相关,并不直接保存数据值。
      

  14.   

    to  sp1234 
    您说的2 的意思是可以理解为服务器端也可以存储ViewState的索引,不知道这样的索引能存几个页面的ViewState索引,如果不存ViewState对象光存索引可行不?可能您说ViewState存在客户端,那么意思是一个页面内的ViewState的信息可能包含其它页面的ViewState信息,或者说ViewState 可以存在服务器端了,那么不跟Session 类似了!如果不对还请指教,学.net 不久还。谢谢!
      

  15.   

    哦,下面又说明了,这下明白些了,浏览器上的“退回”操作是直接重复以前的Http命令,即重新提交前边的操作数据,那么重估提交以前的操作数据,这里的数据是IE缓存的?还是存储在那里的?
      

  16.   


    这当然是浏览软件自身的功能设计决定了。如果我们自己开发一个浏览器,我们也放上一个“退回”按钮,结果我们提交的数据不对,那么这个提交看起来就跟ie的提交的含义完全不同了。从服务器角度,丝毫不关心“退回”这个概念。http是一种无状态的协议,服务器只是知道客户端又有一个新的请求到来,才不管它是不是退回操作能。
      

  17.   

    不好意思,我上面有把你的“退回”看作“刷新”回答的,关于重新提交HTTP POST命令就是。对于“刷新”,基本上各种浏览器都是统一的方式。但是对于退回,我所使用的ie7正是拿出了原来浏览器历史中的html显示(当然此时并不访问服务器),当然其中包括__ViewState。此时是浏览器重新拿出原来页面的内容,此时如果提交就相当于从前一个页面为显示基础又提交了。对于刷新,我相信基本上所有浏览器都一致。但是对于退回,这可能是ie的高版本才这样。低版本好像是重新使用HTTP GET命令从服务器下载页面(我好久没有使用过ie6了)。ie7大概是被这两三年流行的其它浏览器逼得这样改进设计吧。不过,这类浏览器上退回时显示完整的html确实也是浏览器设计上造成的,与服务器端程序无关。可以说,asp.net编程时不能依赖浏览器的这类设计,也就是不能说所有浏览器、所有版本都在退回时这样显示的,肯定要兼容退回时重新Get页面的那种简单的做法。或者对其不要太在意就好了。如果需要检测是否有页面“重复提交”的情况,并在此时在后台进行处理(例如给用户警告提示),可以参考我的另一个帖子
      

  18.   

    关于那个GridView还有一些不明白
    你说GridView只保存当前页面的一些状态,但像 GridView中下面写的1、2、3、4……等页面他不是一下子要取出很多数据,而当点下一页时又要重新从数据库中取,那后面几页那些数据不是没用了啊,而且每次取都要那么多数据,用到的却就一个页面的数据