Les adaptateurs de contrôles sont des composants qui substituent certaines méthodes de la classe Control et certains événements de son cycle de vie d'exécution afin d'autoriser la gestion du navigateur ou celle qui est spécifique au balisage. Le .NET Framework mappe un adaptateur de contrôles dérivés seul à un objet Control pour chaque demande du client.
Un adaptateur modifie le contrôle d'un navigateur ou d'une classe de navigateurs spécifique, ou agit comme un filtre arbitraire sur certaines fonctions. En général l'adaptateur est défini par le langage de balisage utilisé par le navigateur (par exemple, XHTML ou HTML 3.2). La faculté d'adaptation du comportement du rendu peut en grande partie être encapsulée dans les classes spécialisées qui dérivent de la classe HtmlTextWriter. Par conséquent, il est probable qu'un même adaptateur pourra être utilisé pour plusieurs comportements de classe de navigateur ou que cette inclusion de l'adaptabilité dans les classes HtmlTextWriter rendra superflue l'utilisation d'un adaptateur de contrôles.
Un adaptateur pour une classe de contrôle s'applique à tous les contrôles qui héritent de cette classe, à moins que des adaptateurs plus spécialisés soient présents. Par exemple, un adaptateur pour la classe BaseValidator peut être utilisé pour tous les objets Validator.
Les adaptateurs n'héritent généralement pas directement de la classe ControlAdapter, mais de l'une des classes de base de l'adaptateur spécifiques à la cible, qui fournissent des fonctionnalités supplémentaires spécifiques au type de contrôle et au navigateur cible ou au rendu particulier.
Les contrôles proprement dits n'exigent pas nécessairement d'adaptateur. Si les contrôles sont étendus à travers la composition, les adaptateurs de contrôles enfants sont généralement suffisants.
Des mappages explicites vers des adaptateurs sont définis pour chaque contrôle dans les fichiers de définition browser. Ainsi, tout accès à la propriété Control.Adapter utilise l'objet HttpBrowserCapabilities extrait des fichiers de définition de navigateur pour rechercher le mappage de l'adaptateur à contrôler.
Au cours du processus, le .NET Framework intercepte les appels aux méthodes substituables d'un contrôle qui pourraient être spécifiques à la cible. Si un adaptateur de contrôles est attaché, le .NET Framework appelle les méthodes associées à l'adaptateur.
L'adaptateur exécute le rendu pour le contrôle à travers la méthode Render. En cas de substitution, Render ne devrait pas appeler l'implémentation de la classe de base parce que cette action exécute un rappel sur la méthode Control.Render. Le rendu peut alors se produire deux fois, une fois par l'adaptateur et une fois par le contrôle.
La méthode de base Render rappelle la méthode Control.Render du contrôle. Donc, si vous substituez Render, vous ne devez pas appeler l'implémentation de classe de base à moins que le rendu que vous implémentez ne vienne s'ajouter à celui fourni par Control.Render du contrôle.
Vous devez garantir que le .NET Framework exécute l'interception pour les adaptateurs des contrôles enfants. Vous pouvez faire ceci en appelant la méthode de base RenderChildren qui appelle la méthode Control.RenderChildren du contrôle à partir de votre substitution Render.
Les méthodes BeginRender et EndRender sont appelées par le contrôle immédiatement avant et après (respectivement) que le contrôle appelle la méthode Render. Si le pré-rendu et le post-rendu sont les seules tâches de traitement spécifiques au navigateur requises, l'utilisation de BeginRender et EndRender peut rendre superflue la substitution de Render. Le comportement par défaut des méthodes BeginRender et EndRender revient à appeler les méthodes correspondantes de HtmlTextWriter.
Pour maintenir ses propres informations d'état, un adaptateur de contrôles peut substituer les méthodes SaveAdapterControlState, LoadAdapterControlState, SaveAdapterViewState et LoadAdapterViewState.
SaveAdapterControlState
, SaveAdapterViewState, LoadAdapterControlStateet LoadAdapterViewState sont appelés lorsque le contrôle privé et les états d'affichage sont enregistrés et chargés, respectivement.
OnInit
, OnLoad, OnPreRenderet les méthodes de base OnUnload rappellent les méthodes de classe Control correspondantes. Donc, chacune de ces méthodes ControlAdapter substituées doit appeler ses méthodes de base ; sinon, l'événement associé à la méthode de classe Control ne sera pas déclenché.
Les contrôles et adaptateurs implémentent éventuellement les interfaces IPostBackDataHandler et IPostBackEventHandler. Le .NET Framework détermine si un adaptateur existe et si l'adaptateur implémente ces interfaces. S'il le fait, l'adaptateur doit substituer les méthodes LoadPostData, RaisePostDataChangedEvent et RaisePostBackEvent, selon les besoins. Si les données de publication ne sont pas reconnues dans l'adaptateur, il doit effectuer un rappel sur le contrôle pour les traiter. Les gestionnaires d'événements suivants doivent également effectuer un rappel sur le contrôle.
Remarques à l'attention des héritiersLorsque vous héritez de la classe ControlAdapter, un contrôle qui requiert les fonctionnalités d'adaptateur générales doit avoir une classe de base d'adaptateur correspondante, nommée dans le motif ControlTypeAdapter (par exemple, TextBoxAdapter). L'adaptateur doit retourner au minimum une instance fortement typée du contrôle à travers sa propriété Control.
Les adaptateurs de contrôles pour un type de contrôle et un langage de balisage spécifiques doivent être nommés selon le modèle MarkupControlTypeAdapter (par exemple XhtmlTextBoxAdapter). Les adaptateurs d'un contrôle doivent être implémentés dans un sous-espace de noms Adapters.
Les adaptateurs de contrôles doivent hériter de la classe de base appropriée et suivre le même modèle d'héritage que le contrôle. Par exemple, un adaptateur pour un contrôle héritant de la classe de base Control doit hériter de la classe ControlAdapter ou de la classe ControlTypeAdapter appropriée.
Tous les adaptateurs spécialisés doivent être définis, pour le contrôle spécialisé, sous tous les nœuds d'appareil mobile dans les fichiers de configuration browser.
Un contrôle implémenté correctement ne doit pas supposer qu'un adaptateur est joint, ou que l'adaptateur attaché implémente une interface spécifique. À la place, il doit vérifier ceux-ci avant d'effectuer un appel.
Il est possible de simuler la substitution de méthodes d'événement protégées dans le contrôle, comme la méthode OnClick du LinkButton. En premier lieu, créez une classe d'adaptateur avec une méthode OnClick. Puis créez un nouveau contrôle dérivé de LinkButton et substituez la méthode OnClick. La méthode OnClick substituée appelle la méthode OnClick de l'adaptateur. L'objet d'adaptateur est disponible par le biais de la propriété Adapter protégée de la classe Control. La propriété Adapter du contrôle a la valeur null lorsqu'il n'y a pas d'adaptateur associé, tout code doit donc vérifier cette condition avant d'appeler des méthodes de l'adaptateur.