问题一:初次加载页面时,.net将页面中所有控件的状态值保存到隐藏域_VIEWSTATE中,然后回发,这个过程中一般都是我们设定的控件属性,这些是在服务器端设定的,那由客户端改变的属性呢,如:
textbox的text属性(因为这个是由客户端用户输入改变的)是如何通过viewState获得的,比如我一个textbox,初次加载是空的,我在文本框中输入“abc”,这个abc是如何到viewstate中的,通过javascript改变隐藏域_VIEWSTATE ?,还是我理解的viewState有误;问题二:视图状态和控件状态默认都是打开的,那我关闭了全局视图状态,那控件状态仍是有用的,那有什么意义
视图状态和控件状态之前的联系,我现在认为是类似一个全局,一个指定某个控件,有如web.config中设定全局page某个配置,又可以在某个page中指定个别的某个page属性视图状态和控件状态之前的联系也有点迷糊

解决方案 »

  1.   

    你可以自己写一个 html input text 来实现 asp:TextBox  的效果这样可以更好的理解 控件的 viewstate
      

  2.   


    再问下,为什么我的textbox的 EnableViewState="false",回传后,后台设置的Text属性仍然获取到,TextBox的text属性有什么特殊的吗
      

  3.   

    个人理解,负责显示的控件的的值,才保存到 viewstate里,而输入的则不然,输入的值是靠submit获得的
      

  4.   

    因为 textbox 应用的不是viewstate 机制而是 IPostBackEventHandler 和   IPostBackDataHandler接口处理
      

  5.   

    ==>.net将页面中所有控件的状态值保存到隐藏域_VIEWSTATE中
    这句话显然不对,不是所有的,是需要保存状态的。何为状态???不论啥页面提交数据都是通过submit,submit什么内容回去?当然是表单,表单既然都回去了,表单上的值没回去么?如果没回去那还submit什么劲?submit回去了可是你知道上次这个控件是什么样子么?不知道,怎么才能知道呢?隐藏域控件给我传回来我不就知道了么?微软想了个办法(其实在微软想这个办法之前开发者基本上都是这样用的,只是要自己维护)用ViewState。比如触发一个TextOnChange事件,为什么触发?Text的内容变了呗。就是这个道理,为什么不好理解因为人家都帮你封装好了,所以内部的实现不清楚。
      

  6.   

    ViewState保存的是对象序列化后的字符串 
    value保存了控件状态和值,采用Base64编码方式保存, 
    input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
    value="/" /> 
    ViewState在客户端的保存形式,保存在一个ID为__VIEWSTATE的Hidden中,它的Value是使用Base64编码后的字符串。这个字符串实际上是一个对象序列化之后的结果。这个对象保存了整个页面的控件树的ViewState。可以使用一些工具将这个字符串进行解码查看其内容,比如ViewStateDecoder,ViewStateAnalyzer。只有页面在回发(Postback)的情况下才有用 
    protected override object LoadPageStateFromPersistenceMedium() 

        string viewstate = Request.Form["__"]; 
        byte[] data = Convert.FromBase64String(viewstate); 
        string str = Convert.ToBase64String(data); 
        LosFormatter formatter = new LosFormatter(); 
        return formatter.Deserialize(str); 

      

  7.   


    敢问高手:
    控件中的EnableViewState和page中的EnableViewState不是指的都是视图状态吗,只是一个是全局的,一个是针对具体控件的我的页面中 page  EnableViewState="false",然后在控件中EnableViewState="true" 如<cc1:ServerControlTest ID="ServerControlTest1" EnableViewState="true" runat="server" />但这个控件的视图状态还是无效,为什么?但是page中page  EnableViewState="true"时,控件中的EnableViewState="false"时,控件中的视图状态无效的,这个是预期的,但是上面为什么不对,我页面设置禁用视图状态,但控件中视图状态为true