viewstate就是一个<form> 下的<input type="hidden">,asp.net普通情况下是通过from提交信息,而bs程序是无状态的,需要客户端提交信息保持状态,所以需要viewstate

解决方案 »

  1.   

    首先页面回传以后,整个Page将重新生成并且那些页面上声明的静态控件也都已经被解析添加到以Page为根节点的控件树中,那些静态控件对应的静态声明的属性值也都被初始化。然后是OnInit阶段,在这个阶段ASP.NET会调用TrackViewState方法,从此以后所有对控件属性的赋值操作都将导致被跟踪。接着就是LoadViewState()方法被调用,这里那些从_ViewState中反序列化出来的值将被重新赋给对应的控件,由于在此之前TrackViewState()已经被调用了,_ViewState中包含的数据对应的属性值都会被标记为Dirty。这样当调用SaveViewState的时候,这些属性值还是会被持久的保留到_ViewState中,这样在页面的一次次回传和页面一次次的重新建立的过程中,这些控件的值就被保留下来了。
    这个观点来自于:http://www.cnblogs.com/wwan/archive/2010/11/18/1880357.html
      

  2.   

    viewstate就是将以前asp时代繁琐的问题,简单处理,asp要实现保持html控件状态,比较繁琐,每次都需要Request.Form来接收Post的值,然后再附回给html控件(无viewstate的实现方式,aspx也是可以延续这种做法的)
      

  3.   


    第二个问题呢?没了状态,你还能正确的处理回发吗?为什么就不能呢?简单的说,为什么禁用了VIEWSTATE就不能引起回发事情?原因是什么?
      

  4.   


    Request.Form来接收Post的值,然后再附回给html控件 跟是否启用ViewState毫无关系! 不信你可以关闭掉ViewState,然后看看Textbox的值是否能自动加载!
      

  5.   

    MSDN中有详细介绍的:
    http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic3
      

  6.   


    第二个问题呢?没了状态,你还能正确的处理回发吗?为什么就不能呢?简单的说,为什么禁用了VIEWSTATE就不能引起回发事情?原因是什么?
    简单的控件问题不大,比如button和textbox 因为form提交时这个html元素本身就带有他的状态(谁点击的,它的value等等),复杂的比如gridview等,我点击一行数据,如何确定那一行,他的主键值等,这些就需要存在viewstate中。
      

  7.   

    不就是页面上的hidden里的_viewstate么,所以一旦离开页面,viewstate立刻就没了,因为这个页面没了
      

  8.   

    没有viewstate一样可以回发,只是保持不了状态
      

  9.   

    为什么控件缺少了ViewState控件的回发时间就无法进行
    控件需要ViewState来保存回发后的状态,例如TextBox回发后能保存之前输入的值,这样就解决了WEB无状态的问题,不过这个目前已经被AJAX取代了,之前有callback机制可以实现类似AJAX的功能,不过很快被AJAX取代了,毕竟callback机制来世有回发产生,只是最后不render。为什么控件缺少了ViewState控回发事件就无法进行
    这个要看控件的,有些控件,如textbox依赖于ViewState,那么少了ViewState,自然回发后就有问题。但是有些控件不依赖ViewState,如Button控件,你禁用ViewState还是会产生回发。还有framework2.0引入了ControlState,只要我重写init方法时,注册一下ControlState机制,即便你禁用了ViewState,控件还是会通过ControlState保存状态。
      

  10.   


    1.ViewState只不过是一种微软提供的客户端数据存储方式
     ,默认情况下存在客户端(也就是大家看到的hidden中的内容)
     ,但是也可以存在服务器端
     ,完全可以不使用ViewState,而使用其他方案,或者自己设计一种方案,甚至可以联合几种方案共同使用;
    2.了解第一点的话,一种存储方式和一种通信方式直接没有必然的依赖关系
     ,也就是说,没有ViewSate,不影响标准事件的回发
     ,asp.net提供的一些服务器端事件由于依赖于ViewState传递事件标识和参数,所以才会依赖ViewState
     ,但是,你自己完全可以自定义事件绕开ViewState
      

  11.   


    Request.Form来接收Post的值,然后再附回给html控件 跟是否启用ViewState毫无关系! 不信你可以关闭掉ViewState,然后看看Textbox的值是否能自动加载!
    我们可以做个实验,在Button1_Click事件中,编写代码:ListBox.Items.Add(”客户端点击按钮一次!”);此时运行该应用程序,单击网页上的按钮,在ListBox中会添加内容,不断地单击,内容则不断添加。如果我们将ListBox的EnableViewState属性改为false时,不断单击按钮,则只能添加一次。这样有什么好处呢?如果我们在开发Web应用程序时,某些控件是不需要接受用户的操作或只需要接受一次操作的时候,我们可以将这些控件的EnableViewState属性改为false,这样可以优化我们的程序,提高网络访问的速度。
      

  12.   

    转到ASP.NET MVC已经五六年了,对ViewState已经很陌生了
      

  13.   

    最近看了本书,简单说了句就是
    HTTP是无状态的,但是为了使得WebForm像WindowForm那样有状态,所以在WebForm中构造出viewstate这样一个东西,来保留状态。
      

  14.   

    的确用了MVC后,对这些东西的记忆有点模糊了