`

对ViewState的解析

 
阅读更多
最近做项目,使用GridView进行数据编辑,怎么也获取不到用户输入的值,只能获取到目标TextBox和它之前绑定的值。

百思不得其解,后来在网上求助,发现原来是gridView的EnableViewState属性在作怪。下面,就来认识一下这个ViewState 。

什么是ViewState?

ViewState 用来跟踪和保存控件的状态信息。否则这些信息可能会丢失,原因可能是这些值不随着 form 回发,或者根本就不在 page 的 html 中。
ViewState 中保存着代码中改变的控件属性,通过代码绑定到控件的任何数据,以及由用户操作触发,回发的任何更改。
ViewState 还提供了一个状态包(StateBag), 这是一个特殊的集合或字典(collection or dictionary), 可以用来保存,通过一个 key 来恢复任意的对象或者值。

看看MSDN怎么说:


 // 摘要:
         //     获取状态信息的字典,这些信息使您可以在同一页的多个请求间保存和还原服务器控件的视图状态。
         //
         // 返回结果:
         //     包含服务器控件视图状态信息的 System.Web.UI.StateBag 类的实例。
         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
         [Browsable(false)]
         [WebSysDescription("Control_State")]
         protected virtual StateBag ViewState { get; }



ViewState不是什么?

1. ViewState 不是用来恢复回发的控件的值。
这个是通过匹配 form 中该控件的变量名而自动完成的。这个只对 Load 事件加载之前创建的控件有效。
2. ViewState 不会自动重新创建任何通过代码动态创建的控件。
3. 不是用来保存用户信息的。仅仅保存本页的控件状态,而不能在页面之间传递。

如何控制ViewState?

通过控件的EnableViewState属性来控制ViewState。下面来看看MSDN对这个属性的解释:

//
         // 摘要:
         //     获取或设置一个值,该值指示服务器控件是否向发出请求的客户端保持自己的视图状态以及它所包含的任何子控件的视图状态。
         //
         // 返回结果:
         //     如果服务器控件维护自己的视图状态,则为 true;否则为 false。默认值为 true。
         [WebSysDescription("Control_MaintainState")]
         [Themeable(false)]
         [DefaultValue(true)]
         [WebCategory("Behavior")]
         public virtual bool EnableViewState { get; set; }




注意这句话“如果服务器控件维护自己的视图状态,则为 true;否则为 false。默认值为 true。”

因为我没有修改原来的GridView的这个属性,所以怎么也没有获取到用户的输入。因为服务器始终保持着自己的视图状态!

ViewState 的工作原理

ViewState是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传。例如,由 Label 控件显示的文本默认情况下就保存在 ViewState 中。作为开发人员,您可以绑定数据,或在首次加载该页面时仅对 Label 编程设置一次,在后续的回传中,该标签文本将自动从 ViewState 中重新填充。因此,除了可以减少繁琐的工作和代码外,ViewState 通常还可以减少数据库的往返次数。
  ViewState 确实没有什么神秘之处,它是由 ASP.NET 页面框架管理的一个隐藏的窗体字段。当 ASP.NET 执行某个页面时,该页面上的 ViewState 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即 <input type=hidden>)。由于隐藏窗体字段是发送到客户端的页面的一部分,所以 ViewState 值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则 ViewState 字符串也将被回传。在上面的图 2 中可以看到 ViewState 窗体字段及其回传的值。
  回传后,ASP.NET 页面框架将解析 ViewState 字符串,并为该页面和各个控件填充 ViewState 属性。然后,控件再使用 ViewState 数据将自己重新恢复为以前的状态。

关于 ViewState 还有三个值得注意的小问题

如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form runat=server>)。窗体字段是必需的,这样包含 ViewState 信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET 页面框架才能添加隐藏的字段。
页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。
在页面不回传的情况下,可以通过省略服务器端的 <form> 标记来去除页面中的 ViewState。

充分利用 ViewState

ViewState 为跨回传跟踪控件的状态提供了一条神奇的途径,因为它不使用服务器资源、不会超时,并且适用于任何浏览器。如果您要编写控件,那么肯定需要了解如何在控件中维护状态(英文)。
  开发人员在编写页面时同样可以按照几乎相同的方式来利用 ViewState,只是有时页面会包含不由控件存储的 UI 状态值。您可以跟踪 ViewState 中的值,使用的编程语法与会话和高速缓存的语法类似:
  请看下面的示例:要在 Web 页上显示一个项目列表,而每个用户需要不同的列表排序。项目列表是静态的,因此可以将这些页面绑定到相同的缓存数据集,而排序顺序只是用户特定的 UI 状态的一小部分。ViewState 非常适合于存储这种类型的值。代码如下:

<%@ 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>

这是上面引用的testdata.xml文件的代码

<?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 &amp; 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&amp;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>
 


总结:

1:ViewState是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传。这也就是为什么我没有获取

到用户输入的原因。

2:如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form runat=server>)。

3:ViewState不使用服务器资源、不会超时,并且适用于任何浏览器,需要充分利用它。



以上信息来源于网络,不动之处,请查看原文:ViewState: All You Wanted to Know  和ViewState初探 。
分享到:
评论

相关推荐

    ViewState解析工具源码

    【ViewState解析工具源码】是一个专门用于理解和分析ASP.NET网页中的ViewState数据的工具。ViewState是ASP.NET框架中一个重要的概念,它是一种服务器端状态管理机制,用于在HTTP无状态的环境中保持用户交互的数据。...

    asp.net页面中的viewstate内容解析器

    这些工具的主要功能是对页面中获取的ViewState字符串进行解码,将其从Base64编码还原为原始的二进制数据,然后解析出其中包含的信息。这对于调试、分析和理解ASP.NET页面的工作原理非常有帮助。 在ASP.NET 1.1中,...

    ViewState工具.rar

    5. 安全性:值得注意的是,"关于未加密的__VIEWSTATE的参数.txt"可能包含了有关如何处理未加密的ViewState信息,这在某些情况下可能对安全性有所启示。通常,ViewState默认是加密的,但开发者可以选择关闭这一特性,...

    理解ASP.NET的ViewState

    ### 理解ASP.NET的ViewState #### 引言 ASP.NET ViewState是ASP.NET网页用于在PostBack(页面...通过对ViewState的深入了解,开发者不仅可以有效地利用这项功能,还能确保应用程序在保持高效的同时也能达到安全标准。

    ViewState 查看工具

    这个名为"ViewState 查看工具"的压缩包文件很可能包含了一个应用程序或插件,它可以解析ASP.NET页面的ViewState信息。可能包括一个图形用户界面,用于显示和搜索ViewState内容,以及可能的附加功能,如比较不同回发...

    .net ViewState解码器

    `.net ViewState解码器`是一个专门用于解析和理解ViewState数据的工具,对于开发者来说,它能够帮助深入理解ASP.NET的工作原理,尤其是在调试和诊断应用程序时。通过使用这种工具,你可以查看控件的数据是如何在...

    非常方便好用的ViewState查看工具

    ViewState的解码过程涉及到加密算法的逆向工程,通常包括对ASP.NET的默认加密机制的理解,如使用机器特定的Key和IV(初始化向量)进行AES加密。工具可能内置了这些解密逻辑,使用户能够快速查看和理解加密后的...

    Session,ViewState用法

    3. **恢复状态:** 服务器接收到请求后,会解析ViewState中的信息,并恢复到对应的控件上。 ##### ViewState的使用方法: 1. **启用ViewState:** ```xml ``` 默认情况下,服务器控件已经启用了ViewState。 ...

    ViewState查看小程序

    【ViewState查看小程序】是一款名为ViewState Decode 2.0的工具,专为开发者设计,用于方便地查看和解析ASP.NET Web应用程序中的ViewState数据。在Web开发中,尤其是使用ASP.NET框架时,ViewState是一种重要的机制,...

    ViewStateDecoder2.0(解码viewstate).exe

    ViewStateDecoder2.0是一款专门用于解析和理解ASP.NET应用程序中ViewState数据的工具。在ASP.NET框架中,ViewState是一个非常关键的机制,它允许Web应用程序在多个HTTP请求之间持久化页面状态。这个.exe文件提供了...

    session、viewstate jQuery SQL存储过程等一系列教学网站 相当实用哦

    2. 服务器接收到请求后,会解析ViewState中的信息,并重新加载页面控件的状态。 3. 这样,在页面的每次回发之后,用户界面看起来就像是没有刷新一样。 #### 三、ViewState的优缺点 - **优点**: - 自动化:无需...

    Application、Session、Cookie、ViewState、Cache、Hidden的区别

    - **应用范围**:面向所有用户,适用于存储不经常改变且对所有用户可见的数据。 - **保存位置**:服务器端。 - **注意事项**:由于是全局共享,修改需谨慎,避免并发问题。 #### Session - **信息量大小**:适合...

    ViewStateDecoder 1.1

    ViewStateDecoder 1.1的工作原理是首先对页面中的ViewState字符串进行Base64解码,然后尝试解析出内部的序列化对象。这些对象通常包括控件的属性值、控件层次结构等信息。通过这个工具,开发者可以更深入地了解页面...

    ViewState

    对于大型或复杂的项目,可以考虑使用分层架构,将业务逻辑和数据持久化分离,以减少对ViewState的依赖。 总之,ViewState是ASP.NET中一种强大的状态管理工具,但它需要谨慎使用。理解其工作原理、优缺点以及如何...

    viewStateDecoder2.0

    恶意用户可能会篡改ViewState来执行攻击,因此开发者应确保对关键数据进行验证,而不是完全依赖ViewState的完整性。 7. ViewStateDecoder2.0的应用场景:在调试过程中,如果发现控件状态丢失或不一致,可以使用该...

    asp.net viewstat 查看器

    1. **查看ViewState内容**:工具会解析页面的ViewState字段,并以易于理解的形式展示其内部包含的数据结构。 2. **分析数据大小**:可以检查每个控件的ViewState大小,找出可能导致页面加载速度慢的原因。 3. **控制...

    重庆大学web开发技术-王成良-学堂在线解析

    重庆大学web开发技术-王成良-学堂在线解析 本资源为重庆大学web开发技术课程的在线解析,由王成良教授讲解。该课程涵盖了Web开发技术的多个方面,包括HTML、CSS、JavaScript、服务器端编程等。 第一章:HTML基础 ...

    Viewstate和回发数据是否相同?

    在回发过程中,服务器会首先解析Viewstate来恢复控件的状态,然后处理表单中其他的用户输入数据。如果页面没有启用Viewstate,服务器将无法自动恢复控件的状态,而必须依赖于回发数据中的其他信息。 在设计高效且...

Global site tag (gtag.js) - Google Analytics