我正在构建一个应用程序,其中页面将根据查询字符串动态加载用户控件(x.ascx)。
我在页面上有一个验证摘要,并希望从用户控件更新它。这将允许我使用一个验证摘要进行多个控件。如何在控件和页面之间传递数据。
我知道我可以在设计时定义控件并使用事件来执行此操作,但这些控件是使用 Page.LoadControl 动态加载的。
另外,我想避免使用会话或查询字符串。
我正在构建一个应用程序,其中页面将根据查询字符串动态加载用户控件(x.ascx)。
我在页面上有一个验证摘要,并希望从用户控件更新它。这将允许我使用一个验证摘要进行多个控件。如何在控件和页面之间传递数据。
我知道我可以在设计时定义控件并使用事件来执行此操作,但这些控件是使用 Page.LoadControl 动态加载的。
另外,我想避免使用会话或查询字符串。
找到了这样做的方法:
第 1 步:创建一个基本用户控件并在此控件中定义委托和事件。
第 2 步:在基本用户控件中创建一个公共函数以引发在第 1 步中定义的事件。
'第 1 步和第 2 步的源代码 Public Delegate Sub UpdatePageHeaderHandler(ByVal PageHeading As String) 公共类 CommonUserControl 继承 System.Web.UI.UserControl 公共事件 UpdatePageHeaderEvent 作为 UpdatePageHeaderHandler Public Sub UpdatePageHeader(ByVal PageHeadinga As String) RaiseEvent UpdatePageHeaderEvent(PageHeadinga) 结束子 结束类
第 3 步:从您在第 1 步中创建的基本用户控件继承您的 Web 用户控件。
第 4 步:从您的 Web 用户控件 - 调用您在第 2 步中定义的 MyBase.FunctionName。
'步骤 3 和步骤 4 的源代码 部分类 DerivedUserControl 继承 CommonUserControl Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 处理 Me.Load MyBase.PageHeader("测试页眉") 结束子 结束类
第 5 步:在您的页面中,使用 Page.LoadControl 动态加载控件并将控件转换为基本用户控件。
第 6 步:使用此控件附加事件处理程序。
'第 5 步和第 6 步的源代码 私有子 LoadDynamicControl() 尝试 '尝试加载控件 Dim c As CommonUserControl = CType(LoadControl("/Common/Controls/Test.ascx", CommonUserControl)) '将事件处理程序附加到 LoadedControl AddHandler c.UpdatePageHeaderEvent, AddressOf PageHeaders DynamicControlPlaceHolder.Controls.Add(c) 抓住前任作为例外 '日志错误 结束尝试 结束子
假设您正在谈论 asp 的验证器控件,使它们与验证摘要一起工作应该很容易:使用相同的验证组。通常,我从添加了 ValidationGroup 属性的基类派生所有用户控件,该属性的设置器调用将所有内部验证器更改为同一验证组的重写方法。
棘手的部分是让它们在动态添加时表现出来。您应该注意一些问题,主要是关于页面周期以及何时将它们添加到 Page 对象。如果您知道在设计期间将使用的所有可能的用户控件,我会尝试使用 EnableViewState 和 Visible 静态添加它们以最小化开销,即使它们太多。