Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么向复合服务器控件添加子控件会放大视图状态?_C#_Asp.net_Viewstate_Servercontrols - Fatal编程技术网

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

C# 为什么向复合服务器控件添加子控件会放大视图状态?,c#,asp.net,viewstate,servercontrols,C#,Asp.net,Viewstate,Servercontrols,我有复合web服务器控件,它目前不执行任何操作。我的目标是在它里面放置以checkbox开头的子控件。我试着用以下方法来做: [DefaultProperty("Text")] [ToolboxData("<{0}:SubmitImageControl runat=\"server\"></{0}:SubmitImageControl>")] public class SubmitImageControl : CompositeControl { private

我有复合web服务器控件,它目前不执行任何操作。我的目标是在它里面放置以checkbox开头的子控件。我试着用以下方法来做:

[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);
    }
}
然后,如果我们只是删除代码控件,视图状态大小大大减小:

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

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


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

您是否已尝试禁用控件中复选框的viewstate。除非您另有指定,否则我必须使用viewstate来解释此控件?如果希望在生命周期内轻松使用此控件,尽管您希望保持viewstate处于启用状态。

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

禁用复选框的视图状态,以及禁用整个控件,都没有结果:视图状态保持不变的“长”大小。您说过“viewstate必须考虑此控件”;是的,它应该保存控件(和复选框)的状态,但只有在打开视图状态跟踪时控件发生更改时才保存。看起来,添加子元素的操作会影响视图状态。
/wEPDwULLTExMTg2MzM0NjJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBR1jdGwwMCRNYWluQ29udGVudCRjdGwwMCRjdGwwMD+PWeqrbtVyQSNMxvfjcmJkKAwpIuEPWJd+m5W6eJtQ
/wEPDwULLTExMTg2MzM0NjJkZLrri0oSGPS9ZiOTsRtSageoskXzCME4KCdRZxOiJyR9