如何在页面状态禁止的情况下维持控件的状态?

来源:互联网 发布:js用二维数组输出表格 编辑:程序博客网 时间:2024/05/16 07:41

如何在页面状态禁止的情况下维持控件的状态?

ASP.NET 2.0状态管理的新增功能

控件状态

为了让控件正常工作,有时需要存储控件状态数据。例如,如果编写了一个自定义控件,其中具有显示不同信息的不同选项卡,为使该控件如预期一样工作,控件需要知道在往返过程中选择的是哪个选项卡。ViewState 属性可用于此目的,但开发人员可能在页级别关闭了视图状态,从而有效地中断控件。为解决此问题,ASP.NET 页框架在ASP.NET 2.0 版中公开了一种称为控件状态的新功能。

     ControlState 属性允许保持特定于控件的属性信息,不像ViewState 属性一样可以关闭。若要使用控件状态,控件必须在初始化过程中调用RegisterRequiresControlState 方法,然后重写SaveControlState LoadControlState 方法。

 

【源代码】

首先我们创建一个用户控件NumControl.ascx,,在后台代码编写如下:

public partial class NumControl : System.Web.UI.UserControl

{

    Private int currentIndex = 0;

 

    public int getIndex

    {

        set

        {

            this.currentIndex = value;

        }

        get

        {

            return this.currentIndex;

        }

    }

    protected override void OnInit(EventArgs e)

    {

        Page.RegisterRequiresControlState(this);

        base.OnInit(e);

    }

    protected override object SaveControlState()

    {

        return currentIndex != 0 ? (object)currentIndex : null;

        //return base.SaveControlState();

    }

    protected override void LoadControlState(object savedState)

    {

        if (savedState != null)

            currentIndex = (int)savedState;

        //base.LoadControlState(savedState);

    }

    protected void Page_Load(object sender, EventArgs e)

    {

        Response.Write(this.currentIndex.ToString());

    }

}

再新创建一个aspx页面,在上面放置一个按钮和上面创建的用户控件,并按钮事件如下

protected void btn_Add_Click(object sender, EventArgs e)

{

    this.myNum.getIndex++;

}

这样运行后,用户控件也维持了控件状态。

 

ASP.NET 2.0状态管理的新增功能

视图状态分块

图状态提供了一种简单的方法来自动保持页上的字段和控件数据,而不需要在往返服务器期间手动请求并重新填充。它还允许在ViewState 属性中存储页上的自定义数据。

但是,在某些情况下,视图状态数据会变得很大。因为视图数据存储在隐藏的字段中,某些代理或防火墙会阻止对包含这些数据的页的访问。因此,ASP.NET 2.0 页框架引入了一种名为视图状态分块的功能。如果视图状态的数据量变得太大,视图状态分块自动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段中。

     若要启用视图状态分块,请将MaxPageStateFieldLength 属性设置为在单个视图状态字段中允许的最大大小(以字节为单位)。当该页回发到服务器时,该页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。默认设置是-1,这表示不存在最大大小,不会将视图状态分成多个块区

【源代码】

一般情况下我们可以从客户端看到视图状态保存到隐藏域中:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"

value="/wEPDwUJNzYxNDY3MTEyZGQvZPaoYFqnx4XzmHlNwsjTrbK3hw==" />

修改配置文件如下,设置单个视图状态字段中允许的最大大小为50字节:

<system.web>

<pages maxPageStateFieldLength="50"/>

</system.web>

查看客户端VIEWSTATE的隐藏域的名字会增加,也就是把数据块分割成多个:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"

      value="/wEPDwUJNzYxNDY3MTEyZGQvZPaoYFqnx4XzmHlNwsjTrbK3hw" />

<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="==" />