我有复合网络服务器控件,目前不执行任何操作。我的目标是在其中放置以复选框开头的子控件。我尝试通过以下方式做到这一点:
[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 或其他生命周期阶段。无论何时需要 Controls 集合,例如在数据绑定期间(如果适用),服务器控件体系结构都依赖于对 CreateChildControls 的调用。
谁能解释一下为什么视图状态会变大?提前致谢。