<asp:TextBox ID="TextBox1" runat="server" Text="text1" ></asp:TextBox>        protected override void LoadViewState(object savedState)
        {
            Response.Write(TextBox1.Text);
            base.LoadViewState(savedState);
            Response.Write(TextBox1.Text);
        }
        这个方法两次输出的TextBox1.Text都为text1,我页面运行时改了TextBox1的值(修改多次),但是前后还是为text1。我是这样理解 base.LoadViewState(savedState)调用之前为控件的初始值text1,调用后就应该为上次回传后的视图状态的控件值。所以说难道  base.LoadViewState(savedState)的调用难道控件的视图状态没有恢复,要等 protected override void LoadViewState(object savedState)方法执行完成后再去调用page下各个子控件的LoadViewState??

解决方案 »

  1.   

    首先你走入了误区,  TextBox 并不是在 LoadViewState 的时候加载数据的,因为 TextBox  实现了IPostBackDataHandler 接口, 所以 它的数据加载 是在 LoadPostData 时 
    也就是在  LoadViewState 后, Page_load 前
      

  2.   

    看了这个你会更放心,参考:http://blog.csdn.net/zh520/archive/2009/04/19/4091626.aspx
      

  3.   

    获得客户端投递的数据是在LoadPostData,恢复视图状态是在LoadViewState,而且page下子控件的视图状态是在page调用LoadViewState调用后,再去遍历它下面的每个控件对其各个调用LoadViewState对吗?
      

  4.   

    page下子控件的视图状态是在page调用LoadViewState调用后,再去遍历它下面的每个控件对其各个调用LoadViewState对吗?也是不正确的,是 page在调用LoadViewState时 会遍历它下面的每个控件对其各个调用LoadViewState
      

  5.   

    那不对啊,我的那个问题即:
    <asp:TextBox ID="TextBox1" runat="server" Text="text1" ></asp:TextBox>  protected override void LoadViewState(object savedState)
      {
      Response.Write(TextBox1.Text);
      base.LoadViewState(savedState);
      Response.Write(TextBox1.Text);
      }
    这个方法里面为什么两个输出都是text1,即使页面中的TextBox1修改多次,多次回传还是输出text1
    按照你的说法意思base.LoadViewState(savedState)调用后所有控件的视图状态都已经恢复,那下面的输出应该是上一次该控件的视图状态啊,为什么还是总是输出原始值text1
      

  6.   

    base.LoadViewState(savedState);这个方法只会加载Page本身的视图状态,并不会加载页面上子控件的视图状态,所以在这个方法调用的前后,子控件的视图状态并不会变化。子控件的视图状态是由LoadViewStateRecursive这个方法加载的,它是一个internal的方法,一般如果需要等待所有子控件的视图状态加载完成,把代码写在Page_Load中就可以了,这时候子控件的视图状态都已加载完成。另外TextBox的Text属性一般情况下是不会保存到视图中的,只有当TextBox是只读、不可见、禁用等特殊情况下才会保存到视图状态中。
      

  7.   

    page在调用LoadViewState时 会遍历它下面的每个控件对其各个调用LoadViewState
    ------------------------------------------------------------------------
    不好意思 ,这是错误的。正确的是 page 会先调用自己的 LoadAllState 方法在  LoadAllState 方法 内会调用 LoadViewStateRecursive 方法(Control)在 LoadViewStateRecursive 方法 会依次调用 LoadViewState 和LoadChildViewState  是顺序调用的关系, LoadChildViewState 有两个版本 分别是LoadChildViewStateByID 和 LoadChildViewStateByIndex  
     
      

  8.   

    看了这个总算明白了,其实我是想在控件恢复视图状态后的第一时间得到控件的值,那应该 LoadAllState 方法后控件的视图状态就全恢复了,不过这个方法好像是私有的,都不能重写。
      

  9.   

    如果你想得到 textbox 控件的值 在 onInit 事件 就能得到Request.Form[textboxID.UniqueID]
      

  10.   

    如果在page_Load中获得控件的值那该值有可能就不是上一次的视图状态的值了,可能获得的是提交数据后的值了,我是想在控件恢复视图状态后的第一时间里获得它的值
      

  11.   

    解决方案:1、重启IIS,2、删除IE中的缓存。然后再看看吧,如果还是没有变化,那就得好好调试啦。。
      

  12.   


    说了TextBox的Text属性通常情况下是不会保存到视图中的,如果你确实需要记录它的值,可以这么做:
    ViewState["textBox1.text-value"] = TextBox1.Text;
    这样就把TextBox的值保存起来了,以后要用的时候再取出