C# 为什么向复合服务器控件添加子控件会放大视图状态?
我有复合web服务器控件,它目前不执行任何操作。我的目标是在它里面放置以checkbox开头的子控件。我试着用以下方法来做: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
[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