ViewState的使用比较简单,一两句话就可以了。
赋值:ViewState[key] = value;
取值:value = ViewState[key];

最主要的作用就是可以在当前页面保存值,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["VIEW_TEST"] as Test;
        if (test == null)
        {
            test = new Test();
        }
        test[-1] = TextBox1.Text;

        ViewState["VIEW_TEST"] = test;
    }

下面再看一下自定义类Test的实现:

[SerializableAttribute]
class Test
{
    private IList list;

    public Test()
    {
        list = new ArrayList();
    }

    public object this[int index]
    {
        get
        {
            if (index >= list.Count)
            {
                return null;
            }
            return list[index];
        }
        set
        {
            list.Add(value);
        }

    }
}

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

以上所示是序列化的第一种方式:基本序列化,也是比较简单的一种,如果是复杂情况就要使用下面所说的第二种序列化的方式:自定义序列化
假设我们的Test类需要从DataTable继承:

[SerializableAttribute]
class Test : DataTable
{
    public Test()
    {
        DataColumn col = new DataColumn();
        col.DataType = typeof(string);
        col.ColumnName = "name";
        this.Columns.Add(col);
    }

    public object this[int index]
    {
        get
        {
            if (index >= Rows.Count)
            {
                return null;
            }
            return Rows[index]["name"];
        }
        set
        {
            DataRow row = NewRow();
            row["name"] = value;
            Rows.Add(row);
        }
    }
}

那么再把这个类放入ViewState的话就会报错:此页的状态信息无效,可能已损坏,主要是因为它的父类DataTable中的DataRow和DataColumn等是不可序列化的,我们就需要把这个类改造成如下形式:

[SerializableAttribute]
class Test : DataTable, System.Runtime.Serialization.ISerializable
{
    public Test()
    {
        DataColumn col = new DataColumn();
        col.DataType = typeof(string);
        col.ColumnName = "name";
        this.Columns.Add(col);
    }

    public object this[int index]
    {
        get
        {
            if (index >= Rows.Count)
            {
                return null;
            }
            return Rows[index]["name"];
        }
        set
        {
            DataRow row = NewRow();
            row["name"] = value;
            Rows.Add(row);
        }
    }

    public Test(SerializationInfo info, StreamingContext context)
    {
        DataColumn col = new DataColumn();
        col.DataType = typeof(string);
        col.ColumnName = "name";
        this.Columns.Add(col);

        ArrayList list = info.GetValue("list", typeof(ArrayList)) as ArrayList;
        foreach (string value in list)
        {
            DataRow row = NewRow();
            row["name"] = value;
            Rows.Add(row);
        }
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        ArrayList list = new ArrayList();
        foreach (DataRow row in this.Rows)
        {
            list.Add(row["name"]);
        } 
        info.AddValue("list", list);
    }

}

1、实现ISerializable接口
2、实现GetObjectData方法,这个方法中就是把要序列化的对象放入info中,特别注意放入info中的对象本身必须是可以序列化的,如果放入一个DataRow对象,就会报错:未标记为可序列化
3、实现public Test(SerializationInfo info, StreamingContext context) 构造函数,这个函数就是一个反序列化的操作,把info中的对象取出来
经过上面的改造之后,就可以把这个Test对象放入ViewState中了

ViewState使用兼谈序列化相关推荐

  1. 企消互动广告:网络时代广告活动的创新形式——兼谈杜丽反败为胜对企业的启示...

                                               企消互动广告:网络时代广告活动的创新形式                                      ...

  2. 大牛市中大师们如何选股长袖善舞——兼谈本周经济与股市

     大牛市中大师们如何选股长袖善舞--兼谈本周经济与股市 11 结果,又是涨停.新股国信证券在打开涨停前成交量巨大:结果后续者又一个涨停.你想会有涨停,真的就会有涨停.--这就是牛市.此外,在事业单 ...

  3. 技术贴]强大的DELPHI RTTI–兼谈需要了解多种开发语言

    技术贴]强大的DELPHI RTTI–兼谈需要了解多种开发语言 一月 27th, 2005 by 猛禽 风焱在<"18般武艺"?>中说到他碰上的被多种语言纠缠的问题.我 ...

  4. python 相关性分析_数据分析---用Python进行相关性分析(兼谈假设检验)

    一.相关关系和相关系数 世上除了因果关系,还有相关关系. 有一个叫"相关系数"的指标来量化两个事物之间的相关程度. 其中相关系数用"r"表示,取值范围介于-1和 ...

  5. 《转》探讨:3D透视投影变换详解-兼谈视平面和屏幕的宽高比问题

    <转>探讨:3D透视投影变换详解-兼谈视平面和屏幕的宽高比问题 原文:http://www.cnblogs.com/soroman/archive/2006/09/17/509598.ht ...

  6. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong  出处:http://jeffwongishandsome.cnblogs.com/  本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢 ...

  7. 深入理解iPhone委托模式兼谈iPhone生命周期

    深入理解iPhone委托模式兼谈iPhone生命周期(手把手教你iphone开发 - 基础篇) 作者:孙东风 2009-11-23(请尊重作者劳动成果,转载务必注明出处)   每个iPhone应用程序 ...

  8. 朱松纯:初探计算机视觉三个源头兼谈人工智能

    朱松纯   加州大学洛杉矶分校UCLA统计学和计算机科学教授(Song-Chun Zhu:www.stat.ucla.edu/~sczhu) 杨: 朱教授,你在计算机视觉领域耕耘20余年,获得很多奖项 ...

  9. 朱松纯:初探计算机视觉的三个源头_兼谈人工智能

    来源:http://www.stat.ucla.edu/~sczhu/Blog_articles/正本清源:%20初探计算机视觉的三个源头_兼谈人工智能.pdf 我觉得他讲的挺好,机器学习其实并没有本 ...

最新文章

  1. 一阵骚操作,我把SQL执行效率提高了10000000倍!
  2. repeater实现删除按钮
  3. 全国大学生智能汽车竞赛-讯飞智慧餐厅
  4. python快乐编程—基础入门-从萌新到大神必读书籍 《Python快乐编程基础入门》...
  5. BZOJ2888 : 资源运输
  6. linux shutter截图,Ubuntu中安装Shutter截图工具
  7. 隐马尔可夫模型 HMM 原理及实现
  8. Aruba与中国电信国际有限公司达成战略合作 助力中国企业扬帆出海
  9. C++ 杂七杂八的东西
  10. 地温梯度 河南_河南省地热(温泉)分布规律
  11. 生产环境下ftp的迁移并构建corosync+pacemaker的高可用
  12. 软件测试的功能测试和性能测试,大型软件的功能测试流程及性能测试流程
  13. 车架号校验 php代码,VIN车辆识别代码查询(精准版)
  14. 分享一个很容易实现的某大学的结构光源码【DIY自己的三维扫描仪】
  15. 计算机领域中的token的意思
  16. 关于商品详情页接口流程编排框架的一点实践
  17. 单基因gsea_单基因如何干湿结合发5分+泛癌分析
  18. xfs文件系统:格式化以及挂载
  19. 域名如何绑定到服务器ip
  20. 小程序即将上线,现在就可以开发啦

热门文章

  1. [Ext JS 4] 实战之Chart, Column Chart 定制颜色
  2. JSP Include 文件方式
  3. java按钮添加事件_java中添加按钮并添加响应事件的方法(推荐)
  4. 技校计算机科技都学什么好,技校计算机都学什么?
  5. c语言由n个斐波纳函数,6、C语言 —— 字符串
  6. 微信公众号JSSDK中的wx.ready()和wx.error()问题
  7. switch语句判断范围_MQL5从入门到精通【第四章】(一)条件判断语句
  8. java发送post请求json格式_go语言web开发框架学习系列二:Get、Post、Put等请求及数据返回格式...
  9. php红包平均分配,红包平均分配算法
  10. java alt是什么意思_java中这都是什么意思? - 执着的笨蛋 - BlogJava