【问题标题】:How to persist a dynamic control (c#)如何持久化动态控件(c#)
【发布时间】:2026-02-08 23:10:02
【问题描述】:

根据标题,我创建了一个自定义控件。

在某个按钮点击事件中,这个控件被实例化,然后被添加到页面中。

它是一个动态控件,有自己的按钮事件。

为了触发这些按钮事件,控件必须在Page_Load/OnLoad结束时绘制,在随后的page_load/onload生命周期阶段。

我的问题是如何保持这个控制?我无法将它存储在 Session 对象中,因为它包含不可序列化的项目。

【问题讨论】:

  • 为什么需要持久化控件?这听起来像是错误的方法,因为您应该为每个页面请求重新创建一个动态添加的控件。

标签: c# asp.net dynamic-controls


【解决方案1】:

通常对于动态控件,必须在每次回发时添加它们,并且每次都需要连接事件。

【讨论】:

    【解决方案2】:

    您应该在每次回发时重新创建动态控件。最好的方法是CreateChildControls

    要在单击处理程序中设置一些标志(持久标志 - 所以它应该处于视图状态或会话状态)后添加动态控制 - 它应该指示在创建下一页时应该将您的控件添加到其中。在此之后你应该设置ChildControlsCreated = false;
    再次执行此 CreateChildControls 并且您的控件被正确创建并且是持久的(直到您不清除标志)。

    所以应该这样做:

    protected override void CreateChildControls()
    {
            base.CreateChildControls();
        if (ViewState["AddControl"] == true)
            {
             Controls.Add(new MyControl() {Id = "someId" });
            }
    }
    

    和 btn 处理程序

    private void OnShowControlClick(object sender, EventArgs e)
    {
             ViewState["AddControl"] = true;
             ChildControlsCreated = false;
    }
    

    【讨论】:

      【解决方案3】:

      我相信您需要做的就是在预初始化期间使用相同的 ID 重新创建它,asp.net 引擎将从视图状态填充它。

      这不是我的想法,所以我可能会稍微了解一下细节。

      【讨论】:

        【解决方案4】:

        与所有 HTML 页面一样,必须在每个页面请求时重新创建控件。 ASP.NET 使用 ViewState 和 Session 等机制处理大量此类“幕后”。

        如果 ViewState 没有(或不能)跟踪您的控件,那么您需要自己处理。

        我不知道您的控件有多复杂,但作为起点,您可能希望阅读处理 CreateChildControls 事件here (MSDN)

        【讨论】: