如何持久化动态控件(c#)



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

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

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

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

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

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

您应该在每次回发上重新创建动态控件。执行此操作的最佳位置是方法CreateChildControls

要在按钮单击后动态添加控件,在单击处理程序中设置一些标志(持久标志-因此它应该在viewstate或sessionstate中)-它应该表明在下一页创建时应该将控件添加到其中。之后你应该设置ChildControlsCreated = false;
在此之后,CreateChildControls再次执行,您的控件被正确创建并持久(直到您不清除标志)。

所以应该这样做:

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

And btn handler

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

我相信你所需要做的就是在pre init期间用相同的ID重新创建它,asp.net引擎将从viewstate填充它。

这是我的想法,所以我可能有一些细节。

与所有HTML页面一样,必须在每个页面请求时重新创建控件。ASP。. NET通过ViewState和Session等机制处理了很多这样的"底层"。

如果你的控件没有(或不能)被ViewState跟踪,那么你需要自己处理这个问题。

我不知道你的控件有多复杂,但作为一个起点,你可能希望阅读处理CreateChildControls事件在这里(MSDN)

最新更新