为什么向复合服务器控件添加子级会放大视图状态

本文关键字:放大 视图状态 添加 复合 服务器控件 为什么 | 更新日期: 2023-09-27 17:55:32

我有复合Web服务器控件,目前不执行任何操作。我的目标是在其中放置以复选框开头的子控件。我尝试通过以下方式执行此操作:

[DefaultProperty("Text")]
[ToolboxData("<{0}:SubmitImageControl runat='"server'"></{0}:SubmitImageControl>")]
public class SubmitImageControl : CompositeControl
{
    private CheckBox _checkBox;
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
    }
    protected override void CreateChildControls()
    {
        _checkBox = new CheckBox();
        Controls.Add(_checkBox);
        base.CreateChildControls();
    }
    protected override void RenderContents(HtmlTextWriter output)
    {
        _checkBox.RenderControl(output);
    }
}

注册并放置在页面上:

<%@ Register TagPrefix="uc" Namespace="PostBackHandlerApp.Controls" Assembly="PostBackHandlerApp" %>
<uc:SubmitImageControl runat="server" />

复选框出现在页面上,在我们查看视图状态之前,一切似乎都很好。它的值是

/wEPDwULLTExMTg2MzM0NjJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBR1jdGwwMCRNYWluQ29udGVudCRjdGwwMCRjdGwwMD+PWeqrbtVyQSNMxvfjcmJkKAwpIuEPWJd+m5W6eJtQ

然后,如果我们简单地删除代码 Controls.Add(_checkBox);,视图状态大小会大大减少:

/wEPDwULLTExMTg2MzM0NjJkZLrri0oSGPS9ZiOTsRtSageoskXzCME4KCdRZxOiJyR9

如果我移动子初始化代码并添加到我的控件的 OnInit 方法(据我所知,视图状态跟踪仍然被禁用),结果保持不变。此外,此 MSDN 文章建议仅在 CreateChildControls 方法中执行初始化:

应在 CreateChildControls 方法中创建子控件,而不是在 OnInit 或其他生命周期阶段创建子控件。服务器控件体系结构依赖于在需要控件集合时(例如在数据绑定期间(如果适用))对 CreateChildControls 的调用。

谁能解释一下为什么视图状态变大了?提前谢谢。

为什么向复合服务器控件添加子级会放大视图状态

您是否尝试过禁用控件中复选框的视图状态。我预先确定视图状态必须考虑此控件,除非您另有说明?如果要在生命周期中轻松使用此控件,但希望使视图状态保持启用状态。

填充视图状态的原因是通过大部分数据控件(包括复选框)实现 IPostBackDataHandler 接口。接口的方法 LoadPostData 在从发布的数据填充 LoadViewState 事件和视图状态后自动调用。这是一篇关于它的好文章。