• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET2.0服务器控件之自定义状态管理

ASP.NET2.0服务器控件之自定义状态管理

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了asp net2.0,iis注册asp.net2.0,注册asp.net2.0,net2.0,net2.0官方下载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

     在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性。本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法。

  自定义视图状态管理

  在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String、Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能。然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化视图状态管理时,则必须实现自定义视图状态管理。

  实现自定义视图状态管理可以通过两种方法。方法一:实现System.Web.UI命名空间中的IStateManager接口成员,其中包括IsTrackingViewState属性和TrackViewState、SaveViewState和LoadViewState方法。这种方法主要是针对自定义数据类型的视图状态管理的情况。方法二:重写Control基类的3个视图状态管理方法:TrackViewState、SaveViewState和LoadViewState。这些方法与IStateManager接口定义的3个方法名称一致。这种方法主要用于通过自定义方式优化默认视图状态管理的情况,其主要目的在于提高效率和性能。掌握以上两种实现方法的捷径是,必须深刻理解.NET框架内部实现视图状态管理的过程。下面两小节内容都是有关内部实现方法的介绍。每一节中均有实现代码,实际就相当于实例代码。所有服务器控件的自定义视图状态管理的实现都不会偏离那些代码所表达的逻辑。当读者真正掌握了那些内部实现方法,那么自定义视图状态管理的实现方法也就迎刃而解了。

  1、实现基于IStateManager接口的自定义视图状态管理

  对于复杂属性而言,多数需要实现自定义视图状态管理,其关键是实现System.Web.UI.IStateManager接口中定义的方法和属性。下面列举了IStateManager接口定义代码。

public interface IStateManager{ bool IsTrackingViewState {get;} void LoadViewState(object state); object SaveViewState(); void TrackViewState();}
  如上代码所示,IStateManager接口要求类实现IsTrackingViewState属性,以及LoadViewState、SaveViewState和TrackViewState方法。IsTrackingViewState属性定义,当由类实现时,获取一个布尔值,通过该值指示服务器控件是否正在跟踪其视图状态更改。如果服务器控件正在跟踪其视图状态更改,则为true;否则为false。SaveViewState方法定义,当由类实现时,将服务器控件的视图状态更改保存到Object中。LoadViewState方法定义,当由类实现时,加载服务器控件以前保存的控件视图状态,其中的参数state表示包含控件保存的视图状态值的Object。TrackViewState方法定义,当由类实现时,指示服务器控件跟踪其视图状态更改。

  ViewState属性与IStateManager接口之间存在密切联系。ViewState属性的类型是StateBag类,StateBag类通过实现IStateManager接口中定义的方法和属性来参与状态管理。其实现过程如下。

public sealed class StateBag : IStateManager, IDictionary,ICollection, IEnumerable{
 private bool _isTrackingViewState;
 private ArrayList _keys;
 private ArrayList _values;
 private StateItem _item;
 bool IStateManager.IsTrackingViewState {
  get { return _isTrackingViewState; }
 }
 void IStateManager.TrackViewState() {
  _isTrackingViewState = true;
 }
 object IStateManager.SaveViewState() {
  _keys = new ArrayList();
  _values = new ArrayList();
  IDictionaryEnumerator myDirctionaryEnumerator = this.GetEnumerator();
  while(myDictionaryEnumerator.MoveNext()) {
   if(this.Item[(String)myDictionaryEnumerator.Key].IsDirty) {
    _keys.Add(myDictionaryEnumerator.Key);
    _values.Add(myDictionaryEnumerator.Value);
   }
  }
  if(_keys.Count>0) {
   return new Pair(_keys,_values);
  }
 }
 void IStateManager.LoadViewState(object savedState) {
  if(savedState is Pair) {
   _keys = (ArrayList)tempP.First;
   _values = (ArrayList)tempP.Second;
   IDictionaryEnumerator myDirctionaryEnumerator = this.GetEnumerator();
   while(myDictionaryEnumerator.MoveNext()) {
    for(int j=0;j<_keys.Count;j++)
    {
     if((String)myDictionaryEnumerator.Key == _keys[j].ToString());
     {
      this.Item[_keys[j].ToString()].Value = (object)_values[j];
     }
    }
   }
  }
 }
}

  请读者注意:以上代码为示意性代码,并非严格意义上的实现代码。在此列出,主要是用于说明StateBag类实现IStateManager接口的逻辑过程。

  通过上面的代码,我们可以看到:

  (1)在IsTrackingViewState属性中,将该属性设置为只读,并且使用私有变量_isTrackingViewState。

  (2)在TrackViewState方法中,把IsTrackingViewState属性使用的私有变量_isTrackingViewState设置为true,这指示系统当某个StateItem添加到StateBag中,或者某个StateItem值被修改时,StateBag类就会自动将该StateItem标记为修改过即添加dirty标记。

  (3)在SaveViewState方法中,循环StateBag中的每个StateItem,如果该StateItem被标记为dirty,那么就将其键和值分别添加到两个ArrayList中,并返回该对象。

  (4)在LoadViewState方法中,执行了与SaveViewState方法相反的操作。首先将savedState对象分解为两个保存有键和值的ArrayList,然后将其中的值加载到相应的StateItem对象中。

  以上就是ViewState属性实现IStateManager接口的基本过程。所有的视图状态管理过程,都要使用以上的实现过程,因此理解以上逻辑对于深入掌握自定义视图状态管理机制具有举足轻重的作用。

 

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ASP.NET 2.0中的数据操作之九:跨页面的主/从报表
  • ASP.NET 2.0中的数据操作之八:使用两个DropDownList过滤的主/从报表
  • ASP.NET 2.0中的数据操作之七:使用DropDownList过滤的主/从报表
  • ASP.NET2.0使用Enter Key作为默认提交问题分析(附源码)
  • asp.net2.0中css失效的解决方法
  • Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现
  • ASP.NET2.0缓存(Cache)技术深入理解
  • ASP.NET2.0中用Gridview控件操作数据的代码
  • ASP.NET 2.0 程序安全的基础知识
  • asp.net 2.0中利用Ajax2.0实现JSON传送大量页面数据

相关文章

  • 2017-05-11asp.net中资源文件的使用
  • 2017-05-11asp.net的IndexOf,LastIndexOf,IndexOfAny和LastIndexOfAny的用法
  • 2017-05-11微信公众平台开发教程(二) 基本原理及消息接口总结
  • 2017-05-11ASP.NET中常见文件类型、扩展名、存放位置及用途总结
  • 2017-05-11用.NET Core写爬虫爬取电影天堂
  • 2017-05-11ASP.NET 2.0/3.5中直接操作Gridview控件插入新记录
  • 2017-05-11解决iis7.5服务器上.net 获取不到https页面的信息
  • 2017-05-11asp.net多选项卡页面的创建及使用方法
  • 2017-05-11如何解决Ajax请求结果的缓存问题说明
  • 2017-05-11一步一步学asp.net ajax

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • DataGrid中实现超链接的3种方法
    • Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现
    • ASP.NET 2005 Treeview终极解决方案
    • asp.net弹出窗口 返回值
    • AspNetPager控件的最基本用法
    • asp.net保存远程图片的代码
    • asp.net web大文件上传带进度条实例代码
    • 解决asp.net ajax sys未定义的解决方法
    • asp.net EncryptHelper 加密帮助类
    • Asp.net中获取应用程序完整Url路径的小例子

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有