使用Web用户控件更新页面文本
时间:2020-03-06 14:41:42 来源:igfitidea点击:
我正在构建一个应用程序,其中页面将基于查询字符串动态加载用户控件(x.ascx)。
我在页面上有一个验证摘要,并想从用户控件中进行更新。这将使我可以使用一个"验证摘要"进行多个控制。如何在控件和页面之间传递数据。
我知道我可以在设计时定义控件并使用事件来执行此操作,但是这些控件是使用Page.LoadControl动态加载的。
另外,我想避免使用会话或者查询字符串。
解决方案
假设我们正在谈论asp的验证器控件,使它们与验证摘要一起使用应该很容易:使用相同的验证组。通常,我从基类派生所有用户控件,该基类添加了ValidationGroup属性,该属性的setter调用重写方法,该方法将所有内部验证器更改为同一验证组。
棘手的部分是使它们在动态添加时表现出来。我们应该了解一些陷阱,主要涉及页面周期以及何时将它们添加到Page对象中。如果我们知道在设计时将要使用的所有可能的用户控件,我将尝试使用EnableViewState和Visible静态添加它们,以将开销降至最低,即使它们太多。
找到了一种方法:
步骤1:创建一个基本用户控件,并在该控件中定义委托和事件。
步骤2:在基本用户控件中创建一个Public函数,以引发Step1中定义的事件。
'SourceCode for Step 1 and Step 2 Public Delegate Sub UpdatePageHeaderHandler(ByVal PageHeading As String) Public Class CommonUserControl Inherits System.Web.UI.UserControl Public Event UpdatePageHeaderEvent As UpdatePageHeaderHandler Public Sub UpdatePageHeader(ByVal PageHeadinga As String) RaiseEvent UpdatePageHeaderEvent(PageHeadinga) End Sub End Class
步骤3:从在步骤1中创建的基本用户控件继承Web用户控件。
步骤4:从Web用户控件中调用我们在Step2中定义的MyBase.FunctionName。
'SourceCode for Step 3 and Step 4 Partial Class DerievedUserControl Inherits CommonUserControl Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load MyBase.PageHeader("Test Header") End Sub End Class
步骤5:在页面中,使用Page.LoadControl动态加载控件,并将控件转换为基本用户控件。
步骤6:使用此控件添加事件处理程序。
'SourceCode for Step 5 and Step 6 Private Sub LoadDynamicControl() Try 'Try to load control Dim c As CommonUserControl = CType(LoadControl("/Common/Controls/Test.ascx", CommonUserControl)) 'Attach Event Handlers to the LoadedControl AddHandler c.UpdatePageHeaderEvent, AddressOf PageHeaders DynamicControlPlaceHolder.Controls.Add(c) Catch ex As Exception 'Log Error End Try End Sub