Web ユーザー コントロールを使用してページ テキストを更新する
-
02-07-2019 - |
質問
ページがクエリ文字列に基づいてユーザー コントロール (x.ascx) を動的に読み込むアプリケーションを構築しています。
ページに検証概要があり、ユーザー コントロールから更新したいと考えています。これにより、1 つの検証概要を使用して複数のコントロールを使用できるようになります。コントロールとページ間でデータを渡すにはどうすればよいですか。
デザイン時にコントロールを定義し、そのためにイベントを使用できることはわかっていますが、これらのコントロールは Page.LoadControl を使用して動的に読み込まれます。
また、セッションやクエリ文字列の使用は避けたいと考えています。
解決
これを行う方法を見つけました:
ステップ1:基本ユーザー コントロールを作成し、このコントロールでデリゲートとイベントを定義します。
ステップ2:基本ユーザー コントロールにパブリック関数を作成し、ステップ 1 で定義したイベントを発生させます。
'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 ユーザー コントロールから - ステップ 2 で定義した 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 プロパティを追加する基本クラスから派生します。このプロパティのセッターは、すべての内部バリデーターを同じ検証グループに変更するオーバーライドされたメソッドを呼び出します。
難しいのは、動的に追加されたときにそれらを動作させることです。主にページのサイクルと、ページ オブジェクトにページを追加するときに関して、注意すべき注意点がいくつかあります。設計時に使用する可能性のあるすべてのユーザー コントロールがわかっている場合は、たとえその数が多すぎる場合でも、EnableViewState と Visible を使用してそれらを静的に追加してオーバーヘッドを最小限に抑えます。