使用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