快速业务通道

Asp.net ViewState——自定义状态管理(二)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号