很久之前写完了上、中两篇,因为各种原因吧,到现在也没有完成下篇,心里一直有些愧疚。好了,废话不说了,把下篇补上,也是我用到现在的代码。
第一步,新建一个类,并且让类从 BasePage 继承。
第二步,重写 BasePage 类的两个虚方法:GetCacheData 和 SaveCacheData ,分别处理数据的 Load 和 Save 。
第三步,保存这个类,并让页面的后台类(系统默认继承自 Page)继承自这个新类就可以了。
好了,步骤理解之后,原理在上中两篇说的差不多了,剩下的看代码就行了,有问题给我留言就 OK 。
首先是中篇中提到的的 AutoSaveAttribute 特性类:
using System; using System.Diagnostics; namespace Lenic.Web { ///
/// 自动保存属性,配合 BasePage 能够实现 Web 页面后台代码类字段或属性的自动保存和加载。 /// [DebuggerStepThrough] [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public class AutoSaveAttribute : Attribute { ///
/// 初始化创建一个 类的实例,使得具有该属性的类的属性或字段具有自动保存的特性。 /// public AutoSaveAttribute() { } } }
然后是核心处理逻辑 BasePage 虚基类:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Web.UI; namespace Lenic.Web { ///
/// 提供了 Web 页面自动保存属性处理的基类 /// [DebuggerStepThrough] public abstract class BasePage : Page { #region Reload Fields And Properties ///
/// 引发 事件。 /// /// 包含事件数据的
对象。
protected override void OnLoad(EventArgs e) { // 初始化当前用户控件的缓冲字典 InitCacheDic(); if (Page.IsPostBack) { // 获得缓冲数据列表 var list = GetCacheData(); // 自动加载 AutoSave 属性保存的值 int index = 0; foreach (MemberInfo info in CacheDic[CurrType]) { if (info.MemberType == MemberTypes.Property) { PropertyInfo pi = info as PropertyInfo; object value = list[index]; if (value != null) pi.SetValue(this, value, null); } else if (info.MemberType == MemberTypes.Field) { FieldInfo fi = info as FieldInfo; object value = list[index]; fi.SetValue(this, value); } index++; } } base.OnLoad(e); } #endregion #region Save Fields And Properties ///
/// 在这里实现属性的自动保存。 /// protected override object SaveViewState() { // 初始化当前用户控件的缓冲字典 InitCacheDic(); // 初始化要保存的属性值列表 List
最新评论