当前位置:编程学习 > C#/ASP.NET >>

asp.net webform页面状态自动加载和保存方法 (1/2)

首先定义一个特性(attribute)。我会将这个特性放到需要自动加载和保存的属性上,以便将这些需要处理的属性从所有的页面属性中筛选出来,做进一步处理。这个特性的定义如下:
/// <summary>
/// 自动保存属性. 能够实现字段或属性值的自动保存和加载. 该属性只在非静态字段或属性上才能生效.
/// </summary>
/// <remarks>
/// 自动保存属性. 在页面类的属性上面加上该属性. 可以使得该字段或属性能够自动保存和自动加载.
/// 但是该属性必须是可序列化的. 否则抛出异常. 该属性只在非公有字段或属性上才能生效.
/// </remarks>
[attributeusage(attributetargets.property | attributetargets.field, allowmultiple = false, inherited = false)]
public class autosaveattribute : attribute
{
/// <summary>
/// 初始化创建一个 <see cref="autosaveattribute"/> 类的实例. 使得具有该属性的类的属性具有自动保存的特性.
/// </summary>
public autosaveattribute() { }
}
 
然后就是重写页面生命周期的某些事件,加入我们的处理代码。处理的过程为:㈠检索当前页面类型并将其需要处理的属性筛选出来(初始化过程);㈡将筛选出来的属性做保存或赋值操作(关键点)。
 
㈠筛选需要处理的属性,将其缓存到一个静态字典中,在需要的时候再取出来。这个初始化的代码如下:
/// <summary>
/// 用户控件类型及自动保存属性成员缓冲字典
/// </summary>
protected static dictionary<type, memberinfo[]> cachedic = null;
 
/// <summary>
/// 获得成员列表的绑定标识.
/// </summary>
protected static bindingflags flag;
 
/// <summary>
/// 初始化 <see cref="basepage"/> 类.
/// </summary>
static basepage()
{
cachedic = new dictionary<type, memberinfo[]>();
 
flag = bindingflags.public | bindingflags.nonpublic | bindingflags.instance | bindingflags.getfield | bindingflags.getproperty | bindingflags.flattenhierarchy;
}
 
/// <summary>
/// 当前页面的类型
/// </summary>
protected type currtype = null;
/// <summary>
/// 初始化当前页面的缓冲字典
/// </summary>
protected void initcachedic()
{
// 获得当前实例类型
currtype = page.gettype();
 
memberinfo[] mems = null;
 
if (!cachedic.trygetvalue(currtype, out mems))
{
// 自动保存属性处理
var list = currtype.getmembers(flag)
.where(p => attribute.isdefined(p, typeof(autosave), false))
.toarray();
cachedic[currtype] = list;
}
}
 
可以看到,在调用调用初始化函数 initcachedic 时,系统会做两件事:缓存当前页面类型、筛选需要处理的属性。筛选属性反射操作,执行一次后不再重复。
 
1 2
补充:asp.net教程,.Net开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,