zoukankan      html  css  js  c++  java
  • 服务器控件编程中的控件状态保存机制

    服务器控件(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

  • 相关阅读:
    简单数学问题
    MFC 注册表编程
    Windows多线程端口扫描
    MFC Socket双向通信
    凯撒加密
    单片机滤波
    大数素性检验
    大数加法乘法
    Unsafe Code
    委托
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1427827.html
Copyright © 2011-2022 走看看