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:DataGridEnableViewState="false"%>    
  或    
   
  DataGrid1.EnableViewState=   false;    
  在页中:    
   
  <%@   PageEnableViewState="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   才是持续的。

posted @ 2010-07-02 13:40  wnan  阅读(240)  评论(0编辑  收藏  举报