ViewState[key] = value;
或
ViewState.Add(key, value);
取出数据:
TempStr = ViewState[key];
key不存在时返回空。
不能通过ViewState对象来访问控件的值。
' 保存在 ViewState 中 ViewState("SortOrder") = "DESC" ' 从 ViewState 中读取 Dim SortOrder As String = CStr(ViewState("SortOrder"))
// 保存在 ViewState 中 ViewState["SortOrder"] = "DESC"; // 从 ViewState 中读取 string sortOrder = (string)ViewState["SortOrder"];
<%@ Import Namespace="System.Data" %> <HTML> <HEAD> <title>用于页面 UI 状态值的 ViewState/title> </HEAD> <body> <form runat="server"> <H3> 在 ViewState 中存储非控件状态 </H3> <P> 此示例将一列静态数据的当前排序顺序存储在 ViewState 中。<br> 单击列标题中的链接,可按该字段排序数据。<br> 再次单击该链接,将按相反顺序排序。 <br> <br> <br> <asp:datagrid id="DataGrid1" runat="server" OnSortCommand="SortGrid" BorderStyle="None" BorderWidth="1px" BorderColor="#CCCCCC" BackColor="White" CellPadding="5" AllowSorting="True"> <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#006699"> </HeaderStyle> </asp:datagrid> </P> </form> </body> </HTML> <script runat="server"> ' 在 ViewState 中跟踪 SortField 属性 Property SortField() As String Get Dim o As Object = ViewState("SortField") If o Is Nothing Then Return String.Empty End If Return CStr(o) End Get Set(Value As String) If Value = SortField Then ' 与当前排序文件相同,切换排序方向 SortAscending = Not SortAscending End If ViewState("SortField") = Value End Set End Property ' 在 ViewState 中跟踪 SortAscending 属性 Property SortAscending() As Boolean Get Dim o As Object = ViewState("SortAscending") If o Is Nothing Then Return True End If Return CBool(o) End Get Set(Value As Boolean) ViewState("SortAscending") = Value End Set End Property Private Sub Page_Load(sender As Object, e As EventArgs) Handles MyBase.Load If Not Page.IsPostBack Then BindGrid() End If End Sub Sub BindGrid() ' 获取数据 Dim ds As New DataSet() ds.ReadXml(Server.MapPath("TestData.xml")) Dim dv As New DataView(ds.Tables(0)) ' 应用排序过滤器和方向 dv.Sort = SortField If Not SortAscending Then dv.Sort += " DESC" End If ' 绑定网格 DataGrid1.DataSource = dv DataGrid1.DataBind() End Sub Private Sub SortGrid(sender As Object, e As DataGridSortCommandEventArgs) DataGrid1.CurrentPageIndex = 0 SortField = e.SortExpression BindGrid() End Sub </script>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <HTML> <HEAD> <title>用于页面 UI 状态值的 ViewState</title> </HEAD> <body> <form runat="server"> <H3> 在 ViewState 中存储非控件状态 </H3> <P> 此示例将一列静态数据的当前排序顺序存储在 ViewState 中。<br> 单击列标题中的链接,可按该字段排序数据。<br> 再次单击该链接,将按相反顺序排序。 <br> <br> <br> <asp:datagrid id="DataGrid1" runat="server" OnSortCommand="SortGrid" BorderStyle="None" BorderWidth="1px" BorderColor="#CCCCCC" BackColor="White" CellPadding="5" AllowSorting="True"> <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#006699"> </HeaderStyle> </asp:datagrid> </P> </form> </body> </HTML> <script runat="server"> // 在 ViewState 中跟踪 SortField 属性 string SortField { get { object o = ViewState["SortField"]; if (o == null) { return String.Empty; } return (string)o; } set { if (value == SortField) { // 与当前排序文件相同,切换排序方向 SortAscending = !SortAscending; } ViewState["SortField"] = value; } } // 在 ViewState 中跟踪 SortAscending 属性 bool SortAscending { get { object o = ViewState["SortAscending"]; if (o == null) { return true; } return (bool)o; } set { ViewState["SortAscending"] = value; } } void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); } } void BindGrid() { // 获取数据 DataSet ds = new DataSet(); ds.ReadXml(Server.MapPath("TestData.xml")); DataView dv = new DataView(ds.Tables[0]); // 应用排序过滤器和方向 dv.Sort = SortField; if (!SortAscending) { dv.Sort += " DESC"; } // 绑定网格 DataGrid1.DataSource = dv; DataGrid1.DataBind(); } void SortGrid(object sender, DataGridSortCommandEventArgs e) { DataGrid1.CurrentPageIndex = 0; SortField = e.SortExpression; BindGrid(); } </script>
<?xml version="1.0" standalone="yes"?> <NewDataSet> <Table> <pub_id>0736</pub_id> <pub_name>New Moon Books</pub_name> <city>Boston</city> <state>MA</state> <country>USA</country> </Table> <Table> <pub_id>0877</pub_id> <pub_name>Binnet & Hardley</pub_name> <city>Washington</city> <state>DC</state> <country>USA</country> </Table> <Table> <pub_id>1389</pub_id> <pub_name>Algodata Infosystems</pub_name> <city>Berkeley</city> <state>CA</state> <country>USA</country> </Table> <Table> <pub_id>1622</pub_id> <pub_name>Five Lakes Publishing</pub_name> <city>Chicago</city> <state>IL</state> <country>USA</country> </Table> <Table> <pub_id>1756</pub_id> <pub_name>Ramona Publishers</pub_name> <city>Dallas</city> <state>TX</state> <country>USA</country> </Table> <Table> <pub_id>9901</pub_id> <pub_name>GGG&G</pub_name> <city>Muenchen</city> <country>Germany</country> </Table> <Table> <pub_id>9952</pub_id> <pub_name>Scootney Books</pub_name> <city>New York</city> <state>NY</state> <country>USA</country> </Table> <Table> <pub_id>9999</pub_id> <pub_name>Lucerne Publishing</pub_name> <city>Paris</city> <country>France</country> </Table> </NewDataSet>
<%@ Import Namespace="System.Data" %> <html> <body> <form runat="server"> <asp:DataGrid runat="server" /> </form> </body> </html> <script runat="server"> Private Sub Page_Load(sender As Object, e As EventArgs) Dim ds as New DataSet() ds.ReadXml(Server.MapPath("TestData.xml")) DataGrid1.DataSource = ds DataGrid1.DataBind() End Sub </script>
<HTML> <HEAD> <title>减少页面的“HTML 有效负载”</title> </HEAD> <body> <form name="_ctl0" method="post" action="lessviewstate.aspx" id="_ctl0"> <input type="hidden" name="__VIEWSTATE" value="dDwxNTgzOTU2ODA7dDw7bDxpPDE+Oz47bDx0PDtsPGk8MT47PjtsPHQ8QDA8cDxw PGw8UGFnZUNvdW50O18hSXRlbUNvdW50O18hRGF0YVNvdXJjZUl0ZW1Db3VudDtEYXRhS2V 5czs+O2w8aTwxPjtpPDg+O2k8OD47bDw+Oz4+Oz47Ozs7Ozs7OztAMDxAMDxwPGw8SGVhZG VyVGV4dDtEYXRhRmllbGQ7U29ydEV4cHJlc3Npb247UmVhZE9ubHk7PjtsPHB1Yl9pZDtwd WJfaWQ7cHViX2lkO288Zj47Pj47Ozs7PjtAMDxwPGw8SGVhZGVyVGV4dDtEYXRhRmllbGQ7 U29ydEV4cHJlc3Npb247UmVhZE9ubHk7PjtsPHB1Yl9uYW1lO3B1Yl9uYW1lO3B1Yl9uYW1 lO288Zj47Pj47Ozs7PjtAMDxwPGw8SGVhZGVyVGV4dDtEYXRhRmllbGQ7U29ydEV4cHJlc3 Npb247UmVhZE9ubHk7PjtsPGNpdHk7Y2l0eTtjaXR5O288Zj47Pj47Ozs7PjtAMDxwPGw8S GVhZGVyVGV4dDtEYXRhRmllbGQ7U29ydEV4cHJlc3Npb247UmVhZE9ubHk7PjtsPHN0YXRl O3N0YXRlO3N0YXRlO288Zj47Pj47Ozs7PjtAMDxwPGw8SGVhZGVyVGV4dDtEYXRhRmllbGQ 7U29ydEV4cHJlc3Npb247UmVhZE9ubHk7PjtsPGNvdW50cnk7Y291bnRyeTtjb3VudHJ5O2 88Zj47Pj47Ozs7Pjs+Oz47bDxpPDA+Oz47bDx0PDtsPGk8MT47aTwyPjtpPDM+O2k8ND47a Tw1PjtpPDY+O2k8Nz47aTw4Pjs+O2w8dDw7bDxpPDA+O2k8MT47aTwyPjtpPDM+O2k8ND47 PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MDczNjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8TmV 3IE1vb24gQm9va3M7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEJvc3Rvbjs+Pjs+Ozs+O3 Q8cDxwPGw8VGV4dDs+O2w8TUE7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPFVTQTs+Pjs+O zs+Oz4+O3Q8O2w8aTwwPjtpPDE+O2k8Mj47aTwzPjtpPDQ+Oz47bDx0PHA8cDxsPFRleHQ7 PjtsPDA4Nzc7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEJpbm5ldCAmIEhhcmRsZXk7Pj4 7Pjs7Pjt0PH_u56 ?cDxsPFRleHQ7PjtsPFdhc2hpbmd0b247Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPERDOz 4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxVU0E7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47aTwxP jtpPDI+O2k8Mz47aTw0Pjs+O2w8dDxwPHA8bDxUZXh0Oz47bDwxMzg5Oz4+Oz47Oz47dDxw PHA8bDxUZXh0Oz47bDxBbGdvZGF0YSBJbmZvc3lzdGVtczs+Pjs+Ozs+O3Q8cDxwPGw8VGV 4dDs+O2w8QmVya2VsZXk7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPENBOz4+Oz47Oz47dD xwPHA8bDxUZXh0Oz47bDxVU0E7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47aTwxPjtpPDI+O2k8M z47aTw0Pjs+O2w8dDxwPHA8bDxUZXh0Oz47bDwxNjIyOz4+Oz47Oz47dDxwPHA8bDxUZXh0 Oz47bDxGaXZlIExha2VzIFB1Ymxpc2hpbmc7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEN oaWNhZ287Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPElMOz4+Oz47Oz47dDxwPHA8bDxUZX h0Oz47bDxVU0E7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47aTwxPjtpPDI+O2k8Mz47aTw0Pjs+O 2w8dDxwPHA8bDxUZXh0Oz47bDwxNzU2Oz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxSYW1v bmEgUHVibGlzaGVyczs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8RGFsbGFzOz4+Oz47Oz4 7dDxwPHA8bDxUZXh0Oz47bDxUWDs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8VVNBOz4+Oz 47Oz47Pj47dDw7bDxpPDA+O2k8MT47aTwyPjtpPDM+O2k8ND47PjtsPHQ8cDxwPGw8VGV4d Ds+O2w8OTkwMTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8R0dHJkc7Pj47Pjs7Pjt0PHA8 cDxsPFRleHQ7PjtsPE3DvG5jaGVuOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDwmbmJzcFw 7Oz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxHZXJtYW55Oz4+Oz47Oz47Pj47dDw7bDxpPD A+O2k8MT47aTwyPjtpPDM+O2k8ND47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8OTk1Mjs+Pjs+O zs+O3Q8cDxwPGw8VGV4dDs+O2w8U2Nvb3RuZXkgQm9va3M7Pj47Pjs7Pjt0PHA8cDxsPFRl eHQ7PjtsPE5ldyBZb3JrOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxOWTs+Pjs+Ozs+O3Q 8cDxwPGw8VGV4dDs+O2w8VVNBOz4+Oz47Oz47Pj47dDw7bDxpPDA+O2k8MT47aTwyPjtpPD M+O2k8ND47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8OTk5OTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4d Ds+O2w8THVjZXJuZSBQdWJsaXNoaW5nOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxQYXJp czs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Jm5ic3BcOzs+Pjs+Ozs+O3Q8cDxwPGw8VGV 4dDs+O2w8RnJhbmNlOz4+Oz47Oz47Pj47Pj47Pj47Pj47Pj47Pg==" />
<HTML> <HEAD> <title>减少页面的“HTML 有效负载”</title> </HEAD> <body> <form name="_ctl0" method="post" action="lessviewstate.aspx" id="_ctl0"> <input type="hidden" name="__VIEWSTATE" value="dDwxNTgzOTU2ODA7Oz4=" />
<%@ Import Namespace="System.Data" %> <html> <HEAD> <title>减少页面的“HTML 有效负载”</title> </HEAD> <body> <form runat="server"> <H3> 通过禁用 ViewState 来减少页面的“HTML 有效负载” </H3> <P> <asp:datagrid id="DataGrid1" runat="server" EnableViewState="false" BorderStyle="None" BorderWidth="1px" BorderColor="#CCCCCC" BackColor="White" CellPadding="5"> <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#006699"> </HeaderStyle> </asp:datagrid> </P> </form> </body> </html> <script runat="server"> Private Sub Page_Load(sender As Object, e As EventArgs) Dim ds as New DataSet() ds.ReadXml(Server.MapPath("TestData.xml")) DataGrid1.DataSource = ds DataGrid1.DataBind() End Sub </script>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <html> <HEAD> <title>减少页面的“HTML 有效负载”</title> </HEAD> <body> <form runat="server"> <H3> 通过禁用 ViewState 来减少页面的“HTML 有效负载” </H3> <P> <asp:datagrid id="DataGrid1" runat="server" EnableViewState="false" BorderStyle="None" BorderWidth="1px" BorderColor="#CCCCCC" BackColor="White" CellPadding="5"> <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#006699"> </HeaderStyle> </asp:datagrid> </P> </form> </body> </html> <script runat="server"> void Page_Load(object sender, EventArgs e) { DataSet ds = new DataSet(); ds.ReadXml(Server.MapPath("TestData.xml")); DataGrid1.DataSource = ds; DataGrid1.DataBind(); } </script>
<%@Page EnableViewStateMAC=true %>
<machineKey validation="MD5" />
<machineKey validation="3DES" />
<machineKey validation="SHA1" validationKey=" F3690E7A3143C185AB1089616A8B4D81FD55DD7A69EEAA3B32A6AE813ECEECD28DEA66A 23BEE42193729BD48595EBAFE2C2E765BE77E006330BC3B1392D7C73F" />
<%@ Page Language="c#" %> <%@ Import Namespace="System.Security.Cryptography" %> <HTML> <body> <form runat="server"> <H3>生成随机加密密钥</H3> <P> <asp:RadioButtonList id="RadioButtonList1" runat="server" RepeatDirection="Horizontal"> <asp:ListItem Value="40">40-byte</asp:ListItem> <asp:ListItem Value="128" Selected="True">128-byte</asp:ListItem> </asp:RadioButtonList> <asp:Button id="Button1" runat="server" onclick="GenerateKey" Text="生成密钥"> </asp:Button> </P> <P> <asp:TextBox id="TextBox1" runat="server" TextMode="MultiLine" Rows="10" Columns="70" BackColor="#EEEEEE" EnableViewState="False"> 复制并粘贴生成的结果</asp:TextBox> </P> </form> </body> </HTML> <script runat=server> void GenerateKey(object sender, System.EventArgs e) { int keylength = Int32.Parse(RadioButtonList1.SelectedItem.Value); // 在此处放入用于初始化页面的用户代码 byte[] buff = new Byte[keylength/2]; RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); // 该数组已使用密码增强的随机字节进行填充 rng.GetBytes(buff); StringBuilder sb = new StringBuilder(keylength); int i; for (i = 0; i < buff.Length; i++) { sb.Append(String.Format("{0:X2}",buff[i])); } // 粘贴到文本框,用户可从中复制 TextBox1.Text = sb.ToString(); } </script>
ASP.NET中的ViewState
ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。
当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的,对用户来说是透明的。
使用ViewState的条件
如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form runat=server>)。窗体字段是必需的,这样包含 ViewState 信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET 页面框架才能添加隐藏的字段。
Page 的 EnableViewState 属性值为 true。
控件的 EnableViewState 属性值为 true。
页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。
设置ViewState
ViewState可以在控件,页,程序,全局配置中设置。缺省情况下 EnableViewState 为 true 。如果要禁止所有页面 ViewState 功能,可以在程序配置中把 EnableViewState 设为 false 。
在控件中:
<asp:DataGrid EnableViewState="false"%>
或
DataGrid1.EnableViewState = false;
在页中:
<%@ Page EnableViewState="false" %>
或
Page.EnableViewState = false;
在程序中:
在web.config中加入 <pages enableViewState="false" />
在全局配置:
在machine.config中修改 <pages enableViewState="false" />
EnableViewState优先级别:
全局配置 < 程序 < 页 < 控件
注意:下列服务器控件不能禁止ViewState
Textbox
Checkbox
Checkbox List
RadioButtonList
上面控件的状态通过IPostBackEventHandler 和 IPostBackDataHandler接口处理,而不是ViewState的机制,所以EnableViewState没有效果。
ViewState对象
在页面回传间通信,ASP中一般利用窗体的属性和 session 来存放数据,在 ASP.NET 中也可以使用 ViewState 对象来做同样的处理。
在ViewState存放数据:
ViewState[key] = value;
或
ViewState.Add(key, value);
取出数据:
TempStr = ViewState[key];
key不存在时返回空。
不能通过ViewState对象来访问控件的值。
动态建立控件的ViewState:
当需要动态地建立一个服务器控件,如下建立了一个 RadioButton 控件并加入到窗体控件集合中:
RadioButton rb = new RadioButton();
Page.Controls[1].Controls.Add(pc);
上面的代码增加一个控件到控件集合末,同样也可以插入到已有控件中的任何位置。
RadioButton rb = new RadioButton();
Page.Controls[1].Controls.AddAt(1,pc);
通常,这些动态生成的控件的状态也需要生成到 ViewState 中去,但这个功能并没有完全实现,特别是生成的控件插入到已有的控件中时。
当动态生成控件和已有控件并存时 ViewState 的结果是不可预料的。在页面回传时,首先非动态生成的控件在ASPX页中被生成,并在 Page_Init
和 Page_Load 事件中读取 ViewState。当页面的控件读取 ViewState 的值时,那些动态生成的控件却还没有被生成,所以当动态生成的控件被
生成时,页面就会省略掉ViewState或者以剩下或许错误的 ViewState 来填充控件。
所以,当需要插一个动态生成的控件到已有控件中去时,最好把这个控件的 ViewState 通过EnableViewState禁止掉。
提醒:
1. 当存在页面回传时,不需要维持控件的值就要把 ViewState 禁止。
2. ViewState的索引是大小写敏感的。
3. ViewState不是跨页面的。
4. 为了能包存在 ViewState 中,对象必须是可流化或者定义了 TypeConverter。
5. 控件 TextBox 的 TextMode 属性设置为 Password时,它的状态将不会被保存在 ViewState 中,这应该是出于安全性的考虑。
6. 在页面 没有回传 或 重定向 或 在回传中转到(transfer)其他页面 时不要使用 ViewState。
7. 在动态建立控件时要小心它的 ViewState。
8. 当禁止一个程序的 ViewState 时,这个程序的所有页面的 ViewState 也被禁止了。
9. 只有当页面回传自身时 ViewState 才是持续的。
zhuan http://blog.csdn.net/coffeemilk/archive/2003/01/10/12406.aspx