• 服务器控件编程中的控件状态保存机制


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

  • 相关阅读:
    WPF窗口和用户控件事件相互触发
    C#排序算法总结
    C#.NET操作数据库通用类
    在C#的WPF程序使用XAML实现画线
    centos7 用户介绍
    Linux系列2
    nginx的使用
    TCP协议、三次握手以及滑动窗口等的介绍(计算机网络基础知识)
    mysql的
    jQuery的东西
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1427827.html
Copyright © 2020-2023  润新知