65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.29/5 (8投票s)

2007年4月17日

CPOL

2分钟阅读

viewsIcon

73842

downloadIcon

1162

动态加载的用户控件的 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);

希望这有帮助 :-) 在演示应用程序中,你可以找到完整的源代码。

© . All rights reserved.