为什么在复合服务器控件中添加子项会扩大视图状态?

时间:2013-01-23 13:49:23

标签: c# asp.net viewstate servercontrols

我有复合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方法(据我所知,视图状态跟踪仍然被禁用),结果保持不变。另外,this MSDN文章建议仅在CreateChildControls方法中执行初始化:

  

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

有人可以解释为什么视图状态会变大吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试为控件中的复选框禁用viewstate。除非你另有说明,否则我认为viewstate必须考虑这个控件?如果您希望在生命周期内轻松使用此控件,但您希望启用视图状态。

答案 1 :(得分:0)

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