用户名 :<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中的,大侠谁给我说个原理
密码 : <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中的,大侠谁给我说个原理
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE4NTY5ODM3MDBkZGFyghxwczGMXN/W6Nk2jzDf0t1F" />是以隐藏字段形式来保存的!
http://blog.csdn.net/greatverve/archive/2008/11/07/3246223.aspx
回3楼,我知道,那你能告诉我,像我那样向Textbox中输入个值,postback后,那个值还是显示在控件中,这个过程是保存在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);
//要Convert.ToBase64String
string vss = Convert.ToBase64String(buffer);
Response.Write("ViewState:" + Server.HtmlEncode(vss));
}
对于表单控件,除了ViewState保存数据之外,还使用NameValueCollection 老获取数据,也就是通过表单的Request.Form之类的方法保存数据的,因此,即使你禁用了ViewState,仍然可以保留数据。对于TextMode="Password"的TextBox,为安全起见,不进行保存
孟子大哥来了,好兴奋啊,
我还想问问,那什么样的要保存在viewstate中,什么样的要靠遍历NameValueCollection 来获取呢,我发现我要是新加入了一个新控件,viewstate值就变了,还有
NameValueCollection 这个东西起码存的是服务器runat = server 这样的东西吧,呵呵 ,请赐教
其它,如GridView则不会使用NameValueCollection
没用viewState保存.你可以把一个普通的<input id="Text1" type="text" />加上或去掉 runat="server"来做个实验如果加上 runat="server"后他会参与Loadpostdata的过程,去掉则不参与
Loadpostdata方法的定义
protected virtual bool LoadPostData (
string postDataKey,
NameValueCollection postCollection
)第一个参数是 集合中引用要加载的内容的索引
再看一下第二个参数明白了吧?