让阳光指引生命的每一刻,乘着风,跟随我融化空气

美丽的地球,有美丽的cnblog [hjp3]hjptype=song&player=1&son=http://www.taihugolf.com.cn/villa/sound_00ok01.mp3&autoplay=yes&autoreplay=1&bgcolor=FFFFFF&width=200&height=20[/hjp3]

asp.NET自定义服务器控件内部细节系列教程七(状态管理)

七 状态管理

   从控件的生命周期中可知,在保存视图状态阶段,页面对控件树中的每个控件递归地调用SaveViewState方法。然后每个控件返回一个对象,该对象包含了控件在回传请求中用来恢复状态所需要的信息。在生成阶段,页面利用System.Web.UI.LosFormatter类的实例将视图状态串行化成字符串表示,然后在__VIEWSTATE隐藏域中往返传送到客户端。

   Contorl类的默认实现将状态管理委托给了ViewState属性,ViewState属性是一个复杂属性,该属性是一个StateBag类型,是一个字典,StateBag类实现了IStateManager接口来实现状态管理。StateBag保存了键/值对,其中键是字符串而值是对象。当某个对象添加到StateBag实例中时,StageBag自动为该对象存储一个附加位,它用来标志存储的对象是否修改过。

   Control类用于IStateManager接口中相同的成员来实现状态管理,尽管Control并不实现IStateManager接口,只是委托给了实现了IStateManager接口类型的StateBag类,也就是委托给了ViewState属性。在自己的复杂类型状态管理中,可以模仿Control的这种行为,以实现自定义复杂属性的状态管理。

   1。IStateManager接口
      public interface IStateManager
      {
         bool IsTrackingViewState{get;}
         void LoadViewState(object state);
         object SaveViewState();
         void TrackViewState();
      }
     
      先分析Control类是如何通过委托ViewState属性来实现默认的状态管理的:
      private StateBag _viewState ;
      protected virtual StateBag ViewState
      {
         get
         {
           if(_viewState != null){return _viewState;}
           _viewState = new StateBag(ViewStateIgnoresCase);
           if(IsTrackingViewState)
              _viewState. IsTrackingViewState();
           return _viewState;
         }
      }
    
      protected virtual void TrackViewState()
      {
         if(_viewState != null)
         {
            _viewState.TrackViewState();
         }
      }

      protected virtual object SaveViewState()
      {
         if(_viewState != null)
         {
            return _viewState.SaveViewState();
         }

         return null ;
      }

      protected virtual void LoadViewState(object savedState)
      {
         if(_viewState != null)
         {
            viewState.LoadViewState(savedState);
         }
      }

      当在ViewState中保存属性时,它们的状态是自动维护的。任何保存在ViewState中的类型必须是通过LosFormatter串行化的。

      当控件定义了复杂属性时,通常使用ViewState字典来管理这些属性的状态是不可能的,用来表示复杂属性的自定义类型可以通过实现IStateManager接口参与状态管理。
     


 

posted on 2007-05-23 14:57 天真的好蓝啊 阅读(1911) 评论(1)  编辑 收藏 网摘 所属分类: C#.NET

Feedback

#1楼  2007-05-25 12:36 abc [未注册用户]

支持一个.   回复  引用    



标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接:


 

My Links

Blog Stats

News

与我联系

搜索

 

常用链接

留言簿(1)

我管理的小组

我参加的小组

我的标签

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

集从人之所长,创造博客社区神话,实现梦想!