动态加载的用户控件的 ViewState 管理






2.29/5 (8投票s)
动态加载的用户控件的 ViewState 管理。
引言
在我们的许多业务 ASPX 应用程序中,需要特殊的 UserControl 来执行特定的功能,以便可以在整个应用程序中轻松地重复使用。我们可以通过两种方式使用 UserControl:要么将其拖到表单上,要么通过使用 LoadControl("MyUserControl.ascx")
动态加载它。当我们使用第二种方法时,我们(所有人?)会遇到一个主要问题:ViewState 持久性!回发后,当我们在 CS 代码中重新加载控件时,.NET Framework 会忘记其以前状态的所有信息。这篇小文章解决了这个问题。
解决方案!
简单明了:为动态加载的控件分配与数据回发前相同的 ID! 实际上,.NET Framework 保留每个用户控件(即使是动态加载的控件)的状态,并将它们与它们的编程 ID 相关联;在回发之后,它会尝试查找具有相同 ID 的相同控件,以便加载它们以前的状态。 通过一个例子可以更好地解释整个事情 :-)
示例
我们将创建一个简单的 UserControl,它有一个 TexBox
,我们还将有一个 ASPX 表单,我们以三种方式使用这个控件。为此,我们将创建三个实例
- 一个已经拖到表单上的实例
- 一个通过
LoadControl()
动态创建的实例 - 一个通过
LoadControl()
动态创建的实例,其 ID 被保留
我创建了一个简单的 UserControlViewStateManager
,它可以帮助我们自动保存/加载动态加载的控件及其 ID。这个小工具背后的主要思想是在将 UserControl 加载到它们的父容器后立即保存它们的 ID,并在回发后重新创建它们:重新创建控件的最佳位置是 Page_Init
事件。
当创建一个新的用户控件时:只需给它一个唯一的 ID,同时,将它添加到 UserControlViewStateManager
的一个实例中。下面显示了一个代码片段
Control userControl = LoadControl("MyUserControl.ascx");
userControl.ID = (placeHolder2.Controls.Count - 1).ToString();
placeHolder2.Controls.Add(userControl);
ucViewStateManager.AddControl(userControl);
在 Page_Init
事件中,调用辅助类的 ReCreateControlsID()
,并将容器对象作为参数传递给它
ucViewStateManager = new UserControlViewStateManager("SomeUniqueSessionID");
ucViewStateManager.ReCreateControlsID(placeHolder2);
希望这有帮助 :-) 在演示应用程序中,你可以找到完整的源代码。