快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19
/// <returns></returns>     public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)     {       if (destinationType == typeof(string))       {         return true;       }          return false;     }     /**//// <summary>     /// 从特定值进行转换     /// </summary>     /// <param name="context"></param>     /// <param name="culture"></param>     /// <param name="value"></param>     /// <returns></returns>     public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)     {       if (value is string)       {         string str = (string)value;         string[] propertyValues = str.Split('';'');         if (propertyValues.Length == 2)         {           CustomProperty5 obj = new CustomProperty5();           obj.Property1 = propertyValues[0];           obj.Property2 = propertyValues[1];           return obj;         }       }       return base.ConvertFrom(context, culture, value);     }     /**//// <summary>     /// 转换成特定值     /// </summary>     /// <param name="context"></param>     /// <param name="culture"></param>     /// <param name="value"></param>     /// <param name="destinationType"></param>     /// <returns></returns>     public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)     {       if (value is CustomProperty5)       {         CustomProperty5 obj = (CustomProperty5)value;         return obj.Property1 + ";" + obj.Property2;       }       return base.ConvertTo(context, culture, value, destinationType);     }   } }

不难发现,其实就是通过LoadViewState和SaveViewState以及TrackViewState来进行沟通的。

注意这段代码,

public void TrackViewState()
    {
      isTrackingViewState = true;
      ((IStateManager)viewState).TrackViewState();//重要
    }

如果去掉加注释的那段,结果发现视图状态保存失败了,为什么呢?这就又要回归到StateBag的源代码上了,大家可以参考下我的ViewState——运用这篇拙作。

自定义类型的属性都是简单类型的问题解决了,但如果自定义类型的属性本身就是自定义类型呢。可能大家都要笑了,不错,递归处理一下就可以了呗。

在上面的例子中。可以发现复杂属性的set器都是被注释掉了的,为什么呢?我试过给控件的Font属性这样赋值:先new一个FontInfo的对象,然后将这个对象赋给控件的Font属性。结果失败了,因为我们根本就不能访问FontInfo的构造函数。而我们在平时使用的时候基本上都是通过obj.Font.Bold这种形式,而且这种方式也完全满足了我们的需求。但是我们自定义的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号