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

本文介绍ASP.NET2.0中的状态管理功能,包括控件状态和视图状态分块。通过具体示例展示了如何在页面状态被禁用时维持控件状态,以及如何通过配置实现视图状态分块以解决大数据量的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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="==" />

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值