根据标题,我创建了一个自定义控件。
在某个按钮单击事件中,此控件将被实例化,然后添加到页面中。
它是一个动态控件,有它自己的按钮事件。
为了触发这些按钮事件,控件必须在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)