Asp.net ViewState——自定义状态管理(二)
zation.CultureInfo culture, object value, Type destinationType)
{
if (value is CustomProperty4)
{
CustomProperty4 obj = (CustomProperty4)value;
return obj.Property1 + ";" + obj.Property2;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
}
这里我自定义了一个类型转换的Attribute(它所完成的任务很简单,仅仅是类型之间的转换)。注意在Render里面注释掉的代码,事实上它的效果和后面的那行代码完全一样,但是在MSDN有这样一句话:【决不要直接访问类型转换器。而应通过使用 TypeDescriptor 访问适当的转换器】。至于原因我现在也不清楚,就暂时先知其然吧。这样我们就在类型转换Attribute的帮助下完成了我们的视图状态的保存工作。 当然提到视图状态的保存就不得不提到另外一位高人:IStateManager,当我们让复杂属性的类从该接口继承时,我们也可以实现视图状态的保存。 在讨论这个接口前,我想先讨论下另外一个问题:ViewState里面可以直接存储哪些类型的信息? 抛开标记为可序列化的不谈,事实上ViewState里面可以存储的内容都是指定了TypeConverter或者从其派生的Attribute的类型。您可能会问那哪些基本的类型呢(如int,string),我们平时在将这些数据放入ViewState并没有定义这样的Attribute啊。是的,我们没有做这些,但是ms做了,这些基本类型都已经有了相应的类型转换Attribute。 好,回到正题,先来考虑一个简单的例子。假如我们又定义了一个类型CustomProperty5,照旧他还是只包含两个基本类型(string)的属性Property1和Property2。那么是不是可以直接将这两个属性放到ViewState中去呢?可是我们的自定义类并没有也不会从Control或WebControl派生,也就是这个ViewSt属性是没有的。怎么办呢?难道我们不能自己增加一个这样的属性吗?ViewState的类型是StateBag,我们自己定义这样一个成员变量不就可以了吗?定义了这样一个成员变量后问题又来了,怎么才能让包含该类型的复杂属性的自定义控件知道这些信息呢?这时候就要IStateManager出场了。 ViewStateManagement5 using System; using System.Collections.Generic; using System.Text; using System.Web.UI; using System.ComponentModel; using System.Globalization; namespace Controls { public class ViewStateManagement5 : Control { private CustomProperty5 m_Property; [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )] public CustomProperty5 Property { get { if (m_Property == null) { m_Property = new CustomProperty5(); m_Property.TrackViewState(); } return m_Property; } //set //{ //} } protected override object SaveViewState() { object baseState = base.SaveViewState(); object customPropertyState = Property.SaveViewState(); if (customPropertyState != null) { return new Pair(baseState, customPropertyState); } return baseState; } protected override void LoadViewState(object savedState) { if (savedState is Pair) |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |