根据标题,我创建了一个自定义控件。
在某个按钮单击事件上,此控件被实例化,然后添加到页面中。
它是一个动态控件,具有自己的按钮事件。
为了触发这些按钮事件,控件必须在Page_Load
/结束时绘制OnLoad
,在随后的 page_load / onload 生命周期阶段。
我的问题是如何保持这个控制?我不能将它存储在Session
对象中,因为它包含不可序列化的项目。
根据标题,我创建了一个自定义控件。
在某个按钮单击事件上,此控件被实例化,然后添加到页面中。
它是一个动态控件,具有自己的按钮事件。
为了触发这些按钮事件,控件必须在Page_Load
/结束时绘制OnLoad
,在随后的 page_load / onload 生命周期阶段。
我的问题是如何保持这个控制?我不能将它存储在Session
对象中,因为它包含不可序列化的项目。
通常对于动态控件,必须在每次回发时添加它们,并且每次都需要连接事件。
You should recreate dynamic controls on every postback. The best place to do that is method CreateChildControls
.
To add dynamically control after button click set in click handler some flag (persistent flag - so it should be in viewstate or in sessionstate) - it should indicate that on next page creation your control should be added to it. After this you should set ChildControlsCreated = false;
After this CreateChildControls are executed again and your control is created correctly and is persistent (till you not clear flag).
So it should be done in this way:
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;
}
我相信您需要做的就是在预初始化期间使用相同的 ID 重新创建它,并且 asp.net 引擎将从视图状态填充它。
这不在我的脑海中,所以我可能会稍微了解一下细节。
与所有 HTML 页面一样,必须在每个页面请求上重新创建控件。ASP.NET 使用 ViewState 和 Session 等机制处理了很多这种“幕后”。
如果 ViewState 没有(或不能)跟踪您的控件,那么您需要自己处理。
我不知道您的控件有多复杂,但作为起点,您可能希望在此处阅读处理 CreateChildControls 事件 (MSDN)