我正在構建一個應用程序,其中頁面將根據查詢字符串動態地加載用戶控件(x.ascx)。使用web用戶控件更新頁面文本
我在頁面上有一個驗證摘要,並希望從用戶控件更新它。這將允許我使用一個驗證摘要進行多個控件。我如何在控件和頁面之間傳遞數據。
我知道我可以在設計時定義控件,並使用事件來完成,但這些控件是使用Page.LoadControl動態加載的。
此外,我想避免使用會話或查詢字符串。
我正在構建一個應用程序,其中頁面將根據查詢字符串動態地加載用戶控件(x.ascx)。使用web用戶控件更新頁面文本
我在頁面上有一個驗證摘要,並希望從用戶控件更新它。這將允許我使用一個驗證摘要進行多個控件。我如何在控件和頁面之間傳遞數據。
我知道我可以在設計時定義控件,並使用事件來完成,但這些控件是使用Page.LoadControl動態加載的。
此外,我想避免使用會話或查詢字符串。
找到這樣做的一種方法:
步驟1:創建一個基本用戶控制並定義委託和事件在該控制。
第2步:在基本用戶控件中創建一個公共函數來引發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
假設你在談論asp的驗證器控件,使它們與驗證總結一起工作應該很容易:使用相同的驗證組。通常,我從基類中派生出所有的用戶控件,該基類添加了一個ValidationGroup屬性,該屬性的setter調用一個將所有內部驗證器更改爲相同驗證組的overriden方法。
棘手的部分是讓它們在動態添加時表現出來。有一些問題應該注意,主要涉及頁面循環以及將它們添加到Page對象時。如果您知道在設計時使用的所有可能的用戶控件,我會嘗試使用EnableViewState和Visible靜態添加它們,以儘量減少開銷,即使它們太多。