服务器控件(Server Control)是ASP.NET中的一个亮点。我们知道大部分的服务器控件是依赖视图状态(ViewState)的,这个状态的保存有助于在回发(Postback)过程中保留当前控件的值,并进行还原。

虽然视图状态很有用,但它也会带来一些负面的影响,例如它将使得页面体积变大一些,因为它是用字符串(当然是已经经过编码的字符串)的形式保存在页面的一个隐藏域(Hidden Field)中的。基于性能方面的考虑,很多人都建议在合适的时候禁用视图状态(不管是在应用程序级别、页面级别,还是在控件级别),典型的做法例如下面这样就可以了

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" EnableViewState="false" %>

但是,如果视图状态一旦被禁用,那么就自然而然会失去了自动保留状态的特性。这个问题,尤其当我们在开发服务器控件的时候会很严重,一个事实就是:我们无法预知也无法控制使用者是否会在页面级别关闭视图状态。

为此,ASP.NET提供了另外一种机制,我们称为控件状态(Control State)。这使得控件开发者可以自己决定是否保存状态,而不受使用者或者调用方所左右。因为视图状态是无法被禁用的

下面是一个典型的写法

#region 控件状态及其保存

protected override void OnLoad(EventArgs e)

{

base.OnLoad(e);

Page.RequiresControlState(this);//这句代码很重要,声明我们需要为该控件进行状态保存

}

protected override void LoadControlState(object savedState)//重写该方法进行状态的还原

{

base.LoadControlState(savedState);

object[] status = (object[])savedState;

m_RecordCount =(int) status[0];

m_PageSize = (int)status[1];

m_IndexNum = (int)status[2];

m_pageIndex = (int)status[3];

}

protected override object SaveControlState()//重写该方法进行状态的保存

{

object[] status = new object[] { m_RecordCount, m_PageSize, m_IndexNum,m_pageIndex };//如果有多个属性需要保存,可以通过一个对象数组的方式保存

return status;

}

#endregion

服务器控件编程中的控件状态保存机制相关推荐

  1. 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

    文章目录 乐观锁 VS 悲观锁 悲观锁 乐观锁 CAS CAS机制 ABA问题 CAS的优缺点 互斥锁 VS 自旋锁 互斥锁 自旋锁 对比及应用场景 读写锁 实现方式 读写锁 VS 互斥锁 乐观锁 V ...

  2. jsp编程中处理红头文件保存及使用

    在好多的OA系统中,系统外部收到的文件如上机发文等是以红头文件的形式发布的,在OA系统中,如果采取打字的方式找人专门录入一次红头文件内容,对于有些包含领导批示意见等文件并不适用,比较好的办法是采取扫描 ...

  3. Java编程:Java的反射机制中的 getComponentType() 方法

    转载自  Java编程:Java的反射机制中的 getComponentType() 方法 Java 中所有的类都继承自 Object,数组本身也是一个 Class,如果我们能够得到数据的 Class ...

  4. Qt编程中的信号和槽机制

    Qt编程中的信号和槽机制 在使用自定义类创建一个按钮之后,只能看到一个按钮的图形,但是使用鼠标点击并无任何反应,下面想要实现一个"点击按钮可以关闭窗口"的功能. 关闭窗口的功能可以 ...

  5. Java之基础(1) - 编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

  6. TCP/UDP编程中的问题汇总

    TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到 ...

  7. Go并发编程中的那些事[译]

    原文地址:Concurrent programming 原文作者:StefanNilsson 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:kobehah ...

  8. Java编程中“为了性能”需做的26件事

    下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说, ...

  9. Linux 2.6内核中新的锁机制--RCU [转]

    2005 年 7 月 01 日 本文详细地介绍了 Linux 2.6 内核中新的锁机制 RCU(Read-Copy Update) 的实现机制,使用要求与典型应用. 一. 引言 众所周知,为了保护共享 ...

最新文章

  1. 022_applescript快速入门教程
  2. iptables规则的查看、添加、删除和修改
  3. Sublime插件开发 启动Anaconda并运行对应Python脚本
  4. 力扣(LeetCode) 35. 搜索插入位置
  5. heat 用法 示例
  6. .NET平台下几种SOCKET模型的简要性能供参考
  7. CF980D Perfect Groups
  8. uni-app—从安装到卸载
  9. WebSocket协议入门介绍
  10. python自学视频推荐-python自学视频看这个就对了
  11. 计算机二进制祖宗是西方人?中国道教一张八卦图千年前早已解释!
  12. Overlay网络与物理网络的关系
  13. 【C++】面向对象之多态篇
  14. 远程监控系统中关于TP-Link路由器的设置方法
  15. 计算机桌面怎么全屏显示,台式电脑桌面两边黑框怎么调全屏 定位到缩放栏目...
  16. 51单片机:STC-ISP的USB驱动安装解决办法
  17. 红警2 Win7启动一系列问题
  18. 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数
  19. 第七届电工专项 如何进行焊接
  20. django中queryset的两大特性

热门文章

  1. LUA 协程 Coroutine
  2. servlet请求转发
  3. 定义和使用结构体变量
  4. BZOJ 1062 糖果雨
  5. 维护删除订单后,清空安装和售后信息;条码打印软件补充打印问题
  6. break continue
  7. 如何不起协议,R1ping通R3
  8. 如何挖掘大数据的价值
  9. 大数据如何更好进行分析
  10. 通信线路工程验收规范 gb51171-2016_一级建造师市政涉及到的相关规范汇总