用户名 :<asp:TextBox ID="tb_userID" runat="server" ></asp:TextBox><br />
        密码 : <asp:TextBox ID="tb_userPwd" runat="server"></asp:TextBox>
            <asp:Button ID="btn_login" runat="server" Text="登陆" OnClick="btn_login_Click" />比如页面中有textbox,我在其中输入一个值,点击页面的按钮,在postback回来后,这个值仍然会显示在那个textbox中,我看生命周期有关的资料说这是把数据放到页面的viewstate中,然后我想那我输入值后的viewstate和之前的viewstate一定不一样啊,于是找了一段代码,
protected override void SavePageStateToPersistenceMedium(object viewState)
    {
        //base.SavePageStateToPersistenceMedium(viewState);
        LosFormatter format = new LosFormatter();
        StringWriter sw = new StringWriter();
        format.Serialize(sw, viewState);
        string vs = sw.ToString();
        byte[] buffer = Convert.FromBase64String(vs);
        string vss = Encoding.ASCII.GetString(buffer);
        Response.Write("ViewState:" + Server.HtmlEncode(vss));
    }重载的这个方法是申明周期接近尾声时候的方法,这时所有操作都已经完成了,保存viewstate
可是我发现无论我输入什么,打印出来的都是一样的,
结果:ViewState:?d -1157652799d 
还有乱码,这是怎么回事, 到底页面是怎么保持输入值的呢?然后我把EnableViewState="false",这样<asp:TextBox ID="tb_userID" runat="server" EnableViewState="false"></asp:TextBox>
结果一样,说明这个值好象不是保存在viewstate中的,大侠谁给我说个原理

解决方案 »

  1.   

    除了手动向viewstate中存值,viewstate[""] = object; 这样,viewstate里面会保存什么值呢
      

  2.   

    看下页面源代码,基本上每个页面都有类似:
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE4NTY5ODM3MDBkZGFyghxwczGMXN/W6Nk2jzDf0t1F" />是以隐藏字段形式来保存的!
      

  3.   

    1楼什么意思啊?是说第一次加载不对吗?我点button postback也不行啊,我就想知道这个值是怎么postback然后又放到控件中的
      

  4.   

    你好钻研。我只会用。
    http://blog.csdn.net/greatverve/archive/2008/11/07/3246223.aspx
      

  5.   


    回3楼,我知道,那你能告诉我,像我那样向Textbox中输入个值,postback后,那个值还是显示在控件中,这个过程是保存在viewstate中然后再读出来的吗,如果是的话,viewstate应该在输入值的前后不一致才对吧,
      

  6.   

    你是不是在做网页压缩啊>?
    你要打出内容的话要这样
    protected override void SavePageStateToPersistenceMedium(object viewState) 
        { 
            //base.SavePageStateToPersistenceMedium(viewState); 
            LosFormatter format = new LosFormatter(); 
            StringWriter sw = new StringWriter(); 
            format.Serialize(sw, viewState); 
            string vs = sw.ToString(); 
            byte[] buffer = Convert.FromBase64String(vs); 
       //要Convert.ToBase64String
            string vss = Convert.ToBase64String(buffer);
            Response.Write("ViewState:" + Server.HtmlEncode(vss)); 
        } 
      

  7.   

    那是因为:
    对于表单控件,除了ViewState保存数据之外,还使用NameValueCollection 老获取数据,也就是通过表单的Request.Form之类的方法保存数据的,因此,即使你禁用了ViewState,仍然可以保留数据。对于TextMode="Password"的TextBox,为安全起见,不进行保存
      

  8.   

    啊!
    孟子大哥来了,好兴奋啊,
    我还想问问,那什么样的要保存在viewstate中,什么样的要靠遍历NameValueCollection 来获取呢,我发现我要是新加入了一个新控件,viewstate值就变了,还有
    NameValueCollection 这个东西起码存的是服务器runat = server  这样的东西吧,呵呵 ,请赐教
      

  9.   

    NameValueCollection 就是表单元素啊,如input.select等
    其它,如GridView则不会使用NameValueCollection 
      

  10.   

    textbox的值是通过Loadpostdata方法提交,加载的你这样写没用.
    没用viewState保存.你可以把一个普通的<input id="Text1" type="text" />加上或去掉 runat="server"来做个实验如果加上 runat="server"后他会参与Loadpostdata的过程,去掉则不参与
      

  11.   

    你可以看一下
    Loadpostdata方法的定义
    protected virtual bool LoadPostData (
    string postDataKey,
    NameValueCollection postCollection
    )第一个参数是 集合中引用要加载的内容的索引
    再看一下第二个参数明白了吧?
      

  12.   

    那你能告诉我viewstate中都保存什么值吗?是不是除了所谓的“表单元素”其他的都保存在viewstate中呢?
      

  13.   

      你每判断if(!ispostback){}的话每次都重新加载的