tempad
ReadyGo!技术成就梦想 >>基础教程 >> ViewState使用兼谈序列化

ViewState使用兼谈序列化

ReadyGo!技术成就梦想 网络搜索 efish 2008-8-2 23:35:08
         ViewState的使用比较简单,一两句话就可以了。

        赋值:ViewState = value;

        取值:value = ViewState;

        最主要的作用就是可以在当前页面保存值,ASP.NET的页面状态维护就是使用ViewState来实现的,基本上每一个ASPX页面都可以看到如下类似的html代码:          <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTkwNjc4NTIwMWRkyv4ncofW5vaWXdXRtXfXn3RYQR4=" />

        也就是说ViewState中的值实际上都是通过一个hidden来保存的,hidden的name为__VIEWSTATE,那么如果页面上有另外一个控件的名称也叫:__VIEWSTATE的话,会导致页面出错。

        其实在我们进行页面开发或者进行自定义控件开发的时候,都可以使用ViewState,很方便。

        ViewState是ASP.NET中特有的,相对于Session来说,它保存的值只能在当前页面使用,并且保存的只能是已经序列化的类,比如.NET中的strings, integers, Booleans, arrays, ArrayList, hashtable,DataTable等。

        那么如何将自定义的类放入ViewState中呢,这个就涉及到如下所说的序列化的问题了:

        序列化简单来说就是把一个对象转化成一种可以持久保存的数据,当下次需要使用时再把之前保存的数据反序列化成一个对象。

        当然在.NET中提供了简便的方法进行序列化的操作。

        下面我以一个简单的例子来说明

        将自定义类Test保存到viewstate中的按钮事件代码:              protected void Button1_Click(object sender, EventArgs e)
            {
                Test test = ViewState as Test;
                if (test == null)
                {
                    test = new Test();
                }
                test = TextBox1.Text;
                ViewState = test;
            }

        下面再看一下自定义类Test的实现:         
        class Test
        {
            private IList list;
            public Test()
            {
                list = new ArrayList();
            }
            public object this
            {
                get
                {
                    if (index >= list.Count)
                    {
                        return null;
                    }
                    return list;
                }
                set
                {
                    list.Add(value);
                }
            }
        }

        特别注意第一行的SerializableAttribute属性,指定这个属性后就代表此类是可以序列化的(具体序列化的过程都是由.NET内部进行的),那么我们就可以把此类放入ViewState中了,如果没有指定SerializableAttribute属性的话,放入ViewState时就会报错。

        以上所示是序列化的第一种方式:基本序列化,也是比较简单的一种,如果是复杂情况就要使用下面所说的第二种序列化的方式:自定义序列化

        假设我们的Test类需要从DataTable继承:         
        class Test : DataTable
        {
            public Test()
            {
                DataColumn col = new DataColumn();
                col.DataType = typeof(string);
                col.ColumnName = "name";
                this.Columns.Add(col);
            }
            public object this
            {
                get
                {
                    if (index >= Rows.Count)
                    {
                        return null;
                    }
                    return Rows;
                }
                set
                {
                    DataRow row = NewRow();
                    row = value;
                    Rows.Add(row);
                }
            }
        }

责任编辑: efish 参与评论 查找更多:
相关文章
微软CFO:10亿美元收购雅虎搜索 微软CFO:10亿美元收购雅虎搜索
百度首页添加hao123链接 百度首页添加hao123链接
希捷一年出货硬盘1.83亿块 每秒钟近6块 希捷一年出货硬盘1.83亿块 每秒钟近6块
IT界对云计算的20个定义 IT界对云计算的20个定义
用vim处理字符的大小写转换 用vim处理字符的大小写转换
Vim 使用技巧 Vim 使用技巧
GRUB模拟光盘启动 GRUB模拟光盘启动
wine中文支持设置 wine中文支持设置
用WinMount实现文件的瞬时解压 用WinMount实现文件的瞬时解压
驱动备份还原 菜鸟必备DriverMax 驱动备份还原 菜鸟必备DriverMax
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想