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

在上一篇ViewState——自定义状态管理(一)中我在自定义属性的类里面加入了一个重写的ToString方法和一个从字符串获取一个该类型实例的一个构造函数。大家可能会觉得谈到自定义属性的状态管理却不提及TypeConverter(Attribute),有些神奇。好吧,下面就来说说TypeConverter。

先看下MSDN的解释:提供一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法。

在上一篇我自己写了两个方法而没有使用TypeConverter就是想从一方面说明TypeConverter的作用(从这一点来说就是类型转换)。当然TypeConverter还有很多其他用途,比方说提供一组标准值什么的。因此在通常情况下我们都使用TypeConverter来完成这些工作(即使仅仅是只处理类型转换的问题)。就个人理解,TypeConverter是我们在属性窗体为控件属性输入值以及在aspx或ascx声明控件给控件属性赋值时使用的,它可以控制怎样将我们的输入转换成控件属性对应的类型。您可能会说,其实我们自己也可以调用它来做些操作啊,对,这样也可以。

首先,修改下以前的例子:

ViewStateManagement4

namespace Controls
{
  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Web.UI;
  using System.ComponentModel;
  using System.Globalization;
  
  public class ViewStateManagement4 : Control
  {
    private CustomProperty4 m_Property;
    [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )]
    public CustomProperty4 Property
    {
      get
      {
        if (m_Property == null)
        {
          m_Property = new CustomProperty4();
        }
  
        return m_Property;
      }
      //set
      //{
      //}
    }
    protected override void LoadViewState(object savedState)
    {
      if (savedState is Pair)
      {
        Pair properties = (Pair)savedState;
        base.LoadViewState(properties.First);
        m_Property = (CustomProperty4)properties.Second;
      }
      else
      {
        base.LoadViewState(savedState);
      }
    }
    protected override object SaveViewState()
    {
      object baseState = base.SaveViewState();
      if (Property != null)
      {
        return new Pair( baseState, Property);
      }
      return baseState;
    }
    protected override void TrackViewState()
    {
      base.TrackViewState();
    }
  
    protected override void Render(HtmlTextWriter writer)
    {
      //CustomTypeConverter c = new CustomTypeConverter();
      //c.ConvertTo(null, CultureInfo.InvariantCulture, Property, typeof(string));
      //writer.Write(c.ConvertTo(null, CultureInfo.InvariantCulture, Property, typeof(string)));
  
      writer.Write(TypeDescriptor.GetConverter(Property.GetType()).ConvertTo(null, CultureInfo.InvariantCulture, Property, typeof(string)));
    }
  }
  [TypeConverter(typeof( CustomTypeConverter))]
  public class CustomProperty4
  {
    private string m_Property1;
    private string m_Property2;
  
    public string Property2
    {
      get { return m_Property2; }
      set { m_Property2 = value; }
    }
    public string Property1
    {
      get { return m_Property1; }
      set { m_Property1 = value; }
    }
  
  }
  public class CustomTypeConverter : ExpandableObjectConverter
  {
    /**//// <summary>
    /// 指定是否可以从特定的类型进行转换
    /// </summary>
    /// <param name="context"></param>
    /// <param name="sourceType"></param>
    /// <returns>true:可以;false:不可以</returns>
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
      //如果源类型是字符串
      if (sourceType == typeof(string))
      {
        return true;
      }
  
      return false;
    }
    /**//// <summary>
    /// 指定是否可以转换为特定类型
    /// </summary>
    /// <param name="context"></param>
    /// <param name="destinationType"></param>
    /// <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)
        {
          CustomProperty4 obj = new CustomProperty4();
          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 CustomProperty4)
      {
        CustomProperty4 obj = (CustomProperty4)value;
        return obj.Property1 + ";" + obj.Property2;
      }
      return base.ConvertTo(context, culture, value, destinationType);
    }
  }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, return
, 类型
, override
, public
property
,以便于您获取更多的相关知识。

时间: 2024-10-27 01:50:00

Asp.net ViewState——自定义状态管理(二)的相关文章

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

在写自己的控件的时候我们不可能一直只定义string,int等内置类型的属性-夜路走多了总会撞鬼的.当遇到复杂属性(自定义的类型)时,我们该如何来保存其视图状态呢.这个问题困扰了我很久... 下面我想用几个小例子表达下自己的'捉鬼'经历. Husband namespace Controls { using System; using System.Collections.Generic; using System.Text; using System.Web.UI; public class

ASP.NET2.0服务器控件之自定义状态管理

asp.net|服务器|控件 在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化

ASP.NET2.0服务器控件之自定义状态管理_实用技巧

     在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化视图状态管理时,则必

ASP.NET中的状态管理

asp.net 我们在ASP中能够通过cookie.查询字符串.应用程序.对话等轻易地解决这些问题.现在到了ASP.NET环境中,我们仍然可以使用这些功能,只是它们的种类更多了,功能也更强大了. 管理互联网网页主要有二种不同的方法:客户端和服务器端. 1.客户端的状态管理: 在客户端.服务器之间的多次请求-应答期间,服务器上不保存信息,信息将被存储在网页或用户的计算机上. A.Cookie cookie是存储在客户端文件系统的文本文件中或客户端浏览器对话的内存中的少量数据,它主要用来跟踪数据设置

ASP.NET客户端状态管理方式的优缺点

一般而言,HTTP协议是非状态服务,它不保存任何用户请求信息.直至NetScape开始使用Cookies来保存用户请求信息,Web应用程序有了极大的发展.现在ASP.NET程序员可以使用很多种方式来保存用户请求信息. 下面主要介绍ASP.NET关于客户端状态管理的几种方式. ASP.NET,提供了Cookies, QueryStrings (URL), Hidden fields, View State and Control state (ASP.NET 2.0),来管理客户端请求. 一.Co

WEB SERVICES状态管理

services|web WEB SERVICES状态管理 在默认情况下,.NET下的WEB SERVICES是无状态的.不过可以用ASP.NET提供的状态管理那就是SESSION和APPLICATION.这使得WEB SERVICES下状态管理变得简单了,只需使用WEBMETHOD属性的ENABLESESSION子属性就可[WEBMETHOD(ENABLESESSION=TRUE)] 服务端代码如下:[WebMethod(EnableSession= true)] public client

[Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)

原文:[Asp.Net]状态管理(Session.Application.Cache.Cookie .Viewstate.隐藏域 .查询字符串) Session:  1. 客户在服务器上第一次打开Asp.Net页面时,会话就开始了.当客户在20分钟之内没有访问服务器,会话结束,销毁session.(当然也可以在Web.config中设置缓存时间)可以在Global.aspx的Session_Start()事件处理程序中,可以初始化会话变量.在下面的实例中,名为mydata的会话状态被初始化为0:

ASP.NET状态管理之十二(控件状态ControlState)

如果您在编写控件,可以将控件的状态信息存储在 ViewState 字典中,该字典是一个 StateBag 对象.开发人员将通过 ControlState 属性检索控件状态.您为 ViewState 属性指定键和值,Page 对象将对请求之间的状态信息进行序列化.要在您的控件中执行自定义状态处理,可重写 LoadViewState 和 SaveViewState 方法.在页开发人员禁用视图状态时,存储在此字典中的所有状态信息都会丢失.为弥补这一缺陷,在 ASP.NET 2.0 版中,您可以将关键状

ASP.NET状态管理之十一(视图状态ViewState)

视图状态是 ASP.NET 页框架默认情况下用于保存往返过程之间的页和控件值的方法.当呈现页的 HTML 形式时,需要在回发过程中保留的页的当前状态和值将被序列化为 Base64 编码的字符串,并输出到视图状态的隐藏字段中. 视图状态是 ASP.NET 页中的储存库,可以存储需要在回发过程中保留的值.例如,您可以将信息存储在视图状态中,下次将页面发送到服务器时,将会在页加载事件过程中访问这些信息. 您可以使用页的 ViewState 属性(此属性公开一个字典对象)来访问视图状态信息.由于视图状态