mettre à jour le texte de la page à l'aide du contrôle de l'utilisateur Web
-
02-07-2019 - |
Question
Je construis une application dans laquelle une page chargera les contrôles utilisateur (x.ascx) de manière dynamique en fonction de la chaîne de requête.
J'ai un résumé de validation sur la page et je souhaite le mettre à jour à partir des contrôles de l'utilisateur. Cela me permettra d’avoir plusieurs contrôles utilisant un seul résumé de validation. Comment puis-je transmettre des données entre les contrôles et les pages.
Je sais que je peux définir le contrôle au moment de la conception et utiliser des événements pour le faire, mais ces contrôles sont chargés de manière dynamique à l'aide de Page.LoadControl.
De plus, je souhaite éviter l'utilisation de sessions ou de chaînes de requête.
La solution
Vous avez trouvé un moyen de le faire:
Étape 1: créez un contrôle utilisateur de base et définissez les délégués et les événements dans ce contrôle.
Étape 2: créez une fonction publique dans le contrôle utilisateur de base pour déclencher les événements définis à l'étape 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
Étape 3: héritez de votre contrôle utilisateur Web du contrôle utilisateur de base que vous avez créé à l'étape 1.
Étape 4: à partir de votre contrôle utilisateur Web - Appelez le MyBase.FunctionName que vous avez défini à l'étape 2.
'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
Étape 5: dans votre page, chargez le contrôle dynamiquement à l'aide de Page.LoadControl et définissez le contrôle en tant que contrôle utilisateur de base.
Étape 6: attachez des gestionnaires d'événements avec ce contrôle.
'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
Autres conseils
En supposant que vous parlez des commandes du validateur asp, leur utilisation avec le résumé de validation devrait être simple: utilisez le même groupe de validation. Normalement, je dérive tous les contrôles utilisateur d'une classe de base qui ajoute une propriété ValidationGroup dont le configurateur appelle une méthode surchargée qui modifie tous les validateurs internes dans le même groupe de validation.
La partie délicate consiste à les faire se comporter lorsqu’ils sont ajoutés dynamiquement. Vous devez être conscient de certains pièges, principalement en ce qui concerne le cycle de page et le moment où vous les ajoutez à votre objet Page. Si vous connaissez tous les contrôles utilisateur possibles que vous utiliserez pendant la conception, j'essaierais de les ajouter de manière statique en utilisant EnableViewState et Visible afin de réduire les frais généraux, même s'il y en a trop.