Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source
0 sur 3 ont trouvé cela utile - Évaluez ce sujet

Identification du contrôle serveur Web ASP.NET

Chaque contrôle inclus dans une page Web ASP.NET doit contenir un identificateur (ID) unique. Si vous n'assignez pas explicitement d'ID à un contrôle lorsque vous ajoutez ce contrôle à une page Web, ASP.NET crée automatiquement un ID par défaut. Lorsqu'un contrôle est inclus à l'intérieur d'un contrôle à répétition, tel que le contrôle GridView, ListView ou Repeater, un seul contrôle défini dans le balisage crée souvent plusieurs instances de ce contrôle dans le code HTML restitué. Grâce à un mécanisme proposé par l'infrastructure de page ASP.NET, chaque contrôle figurant dans le code HTML restitué d'une page est assuré de posséder un ID unique.

Les contrôles serveur Web ASP.NET incluent les propriétés suivantes qui jouent le rôle d'identificateurs :

  • ID. ID que vous spécifiez dans le balisage ou en définissant la propriété ID du contrôle.

  • UniqueID. ID généré par ASP.NET en vue d'être utilisé par le code qui s'exécute sur le serveur.

  • ClientID. ID généré par ASP.NET en vue d'être utilisé par le code client (il est restitué en tant que valeur de l'attribut id dans le code HTML).

Propriété UniqueID

Le .NET Framework génère la propriété UniqueID en tant qu'identificateur qualifié complet pour un contrôle. Au moment de l'exécution, aucun des contrôles figurant dans une page Web n'aura la même propriété UniqueID.

Lorsque le contrôle se trouve à l'intérieur d'un autre contrôle, la propriété UniqueID contient la valeur de la propriété ID concaténée avec le nom du conteneur d'attribution de noms. Les contrôles qui peuvent jouer le rôle de conteneurs pour d'autres contrôles génèrent un conteneur d'attribution de noms, lequel constitue un espace de noms d'ID pour leurs contrôles enfants. Les contrôles qui jouent le rôle de conteneur d'attribution de noms implémentent l'interface INamingContainer. ListView, Repeater et DataGrid sont des exemples de contrôles de conteneur d'attribution de noms.

Lorsque le contrôle se trouve à l'intérieur d'un contrôle lié aux données qui crée plusieurs instances du contrôle, la valeur que vous assignez à la propriété ID est concaténée avec le conteneur d'attribution de noms et avec un index à incrémentation.

Vous n'aurez généralement pas à utiliser la propriété UniqueID. Par exemple, vous ne devez pas écrire de code référençant des contrôles à l'aide d'une valeur prédite de la propriété UniqueID générée. Vous pouvez lire et passer la valeur de la propriété UniqueID à d'autres processus, mais vous ne devez pas partir du principe qu'elle possède une structure spécifique.

Propriété ClientID

La propriété ClientID contient la valeur définie en tant qu'attribut id de l'élément restitué du contrôle dans le code HTML de la page Web. Vous pouvez utiliser l'attribut id pour accéder au contrôle à partir du script client.

Vous ne pouvez pas définir la propriété ClientID, mais vous pouvez spécifier son mode de génération en affectant à la propriété ClientIDMode l'une des valeurs suivantes :

  • AutoID. ClientID est généré de la même manière que dans le .NET Framework version 3.5 ou ultérieure. La propriété ClientID du conteneur d'attribution de noms parent et la propriété ID du contrôle sont concaténées. Dans les scénarios de liaison de données qui restituent plusieurs itérations d'un contrôle, une valeur à incrémentation est insérée avant l'ID du contrôle et après les ID de conteneur d'attribution de noms. Chaque segment est séparé par un trait de soulignement (_).

  • Static. La propriété ClientID contient la valeur de la propriété ID sans aucune modification. Vous pouvez utiliser cette valeur lorsque vous avez besoin que la propriété ClientID reste la même dans tous les scénarios et que vous avez une seule instance du contrôle dans une page. Vous pouvez également utiliser cette valeur pour réduire la longueur des valeurs ClientID générées, pour simplifier le script client ou pour améliorer les performances en diminuant la taille du script client qui est envoyé au navigateur. Lorsque les contrôles serveur se trouvent dans des conteneurs d'attribution de noms, l'algorithme AutoID peut générer des valeurs ClientID très longues.

    Remarque Remarque

    Si vous utilisez l'algorithme Static, il est possible qu'ASP.NET crée plusieurs éléments HTML ayant le même attribut id. Dans ce cas, c'est le navigateur qui restitue la page. Si toutefois vous essayez d'utiliser le script client pour accéder à l'un de ces éléments par ID, une erreur se produit.

  • Predictable. Cette option est destinée aux scénarios de liaison de données. Si le contrôle est un contrôle lié aux données qui possède une propriété ClientIDRowSuffix, vous pouvez modifier la valeur ClientID de chaque instance du contrôle en ajoutant la valeur d'un champ que vous spécifiez dans la propriété ClientIDRowSuffix. Pour le contrôle GridView, vous pouvez entrer plusieurs noms de champs séparés par des virgules. Si le contrôle lié aux données génère plusieurs lignes mais ne possède pas de propriété ClientIDRowSuffix ou si vous laissez la propriété ClientIDRowSuffix vide, ASP.NET utilise un numéro séquentiel en tant que suffixe ClientID.

  • Inherit. La propriété ClientID est générée à partir de la valeur ClientIDMode du contrôle contenant ou à partir de la valeur ClientIDMode de la page lorsque le contrôle ne se trouve pas dans un conteneur d'attribution de noms. Il s'agit de la valeur par défaut pour la propriété Control.ClientIDMode.

Vous pouvez définir la valeur ClientIDMode par défaut d'un site dans le fichier Web.config et définir la valeur par défaut d'une page dans la directive @ Page. Si vous ne définissez pas de valeur au niveau du site ou de la page, la valeur par défaut est Predictable. Comme la valeur par défaut du contrôle est Inherit, le mode de génération par défaut est Predictable. (Toutefois, si vous utilisez Visual Studio pour convertir un projet Web en ASP.NET 4 d'une version antérieure, Visual Studio définit la valeur par défaut du site sur AutoID dans le fichier Web.config.)

L'exemple suivant indique comment définir le ClientIDMode par défaut d'un site dans le fichier Web.config.

<pages clientIDMode="Static">

L'exemple suivant indique comment définir le ClientIDMode par défaut d'une page dans la directive @ Page.

<%@ Page Language="C#" CodeFile="Default.aspx.cs"

  Inherits="_Default" ClientIDMode="Static" %>

Lorsqu'un contrôle ne se trouve pas à l'intérieur d'un conteneur d'attribution de noms ni d'un contrôle lié aux données, ASP.NET utilise la valeur d'ID de la propriété UniqueID et la propriété ClientID. L'exemple suivant montre un contrôle Label qui ne se trouve pas à l'intérieur d'un conteneur d'attribution de noms :

<asp:Label ID="Label1" runat="server"

  ClientIDMode=valeur

  Text="Label">

</asp:Label>

Lorsqu'un contrôle ne se trouve pas à l'intérieur d'un conteneur d'attribution de noms, la propriété ClientIDMode n'affecte pas la valeur de propriété ClientID générée. Tous les ID sont de ce fait les mêmes, quelle que soit la valeur que vous affectez à la propriété ClientIDMode.

Lorsque la page s'exécute, le contrôle Label1 a les valeurs de propriété suivantes :

  • ID: Label1

  • UniqueID: Label1

  • ClientID: Label1

Lorsqu'un contrôle se trouve à l'intérieur d'un conteneur d'attribution de noms, ASP.NET génère la valeur de propriété UniqueID et la valeur de propriété ClientID en combinant les valeurs ID de tous les contrôles figurant dans la hiérarchie d'imbrication. Si toutefois le ClientIDMode de tout contrôle figurant dans la hiérarchie d'imbrication a la valeur Static, les valeurs ID des contrôles qui sont situés plus haut dans la hiérarchie ne sont pas incluses.

Les conteneurs d'attribution de noms communs incluent des pages maîtres et des pages de contenu. L'exemple suivant montre un contrôle Label qui se trouve dans un contrôle utilisateur. Le contrôle utilisateur se trouve à l'intérieur d'une page de contenu qui se trouve elle-même à l'intérieur d'une page maître.

Remarque Remarque

Seules les sections pertinentes de la page maître, de la page de contenu et du contrôle utilisateur sont indiquées dans les exemples suivants.

La page maître contient l'espace réservé de contenu suivant :

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

</asp:ContentPlaceHolder>

La page de contenu contient la section de contenu suivante :

<asp:Content ID="Content2"

  ContentPlaceHolderID="ContentPlaceHolder1"

  Runat="server">

  <uc:ExampleLabelControl ID="CustomUserControl1" runat="server" />

</asp:Content>

Le contrôle utilisateur contient le contrôle Label suivant :

<asp:Label ClientIDMode=valeur

  ID="NestedExampleLabel"

  Text="Example" >

</asp:Label>

Si vous affectez à la propriété ClientIDMode du contrôle Label la valeur AutoID, lorsque la page s'exécute, le contrôle NestedExampleLabel a les valeurs de propriété suivantes :

  • ID: NestedExampleLabel

  • UniqueID: ctl00$ContentPlaceHolder1$CustomUserControl1$NestedExampleLabel

  • ClientID: ctl00_ContentPlaceHolder1_CustomUserControl1_NestedExampleLabel

Si vous affectez à la propriété ClientIDMode du contrôle Label la valeur Static, lorsque la page s'exécute, le contrôle NestedExampleLabel a les valeurs de propriété suivantes :

  • ID: NestedExampleLabel

  • UniqueID: ctl00$ContentPlaceHolder1$CustomUserControl1$NestedExampleLabel

  • ClientID: NestedExampleLabel

Lorsqu'un contrôle se trouve à l'intérieur d'un contrôle lié aux données qui génère des instances répétées de ce contrôle, ASP.NET génère les valeurs UniqueID et ClientID de chaque instance du contrôle. La valeur UniqueID est générée en combinant la valeur UniqueID du conteneur d'attribution de noms, la valeur ID du contrôle et un numéro séquentiel. Tel est le cas avec des contrôles comme DataList, Repeater, GridView et ListView.

ASP.NET génère des valeurs ClientID de façon similaire lorsque la propriété ClientIDMode a la valeur AutoID. Cela peut rendre le référencement du contrôle difficile dans le script client, car vous ne pouvez généralement pas prédire les valeurs des numéros séquentiels utilisés. Si vous souhaitez accéder aux contrôles liés aux données à partir du script client, vous pouvez affecter à la propriété ClientIDMode la valeur Predictable. Cela facilite la prédiction des valeurs ClientID.

Lorsque vous affectez au ClientIDMode la valeur Predictable, vous pouvez également affecter à la propriété ClientIDRowSuffixDataKeys le nom d'un champ de données qui est unique (clé primaire dans une table de base de données, par exemple). ASP.NET génère alors un ID client qui est plus facile à prédire et à référencer dans le script client si vous pouvez prédire les valeurs des clés des données.

Lorsque vous affectez à la propriété ClientIDMode la valeur Static dans un scénario de liaison de données, aucune exception n'est levée. La valeur de ClientID est toutefois la même pour tous les contrôles. Dans ce cas, vous n'êtes pas en mesure d'utiliser l'attribut id HTML pour référencer un contrôle spécifique dans le script client.

L'exemple suivant montre un contrôle XmlDataSource, un contrôle ListView qui y est lié et les contrôles Label qui se trouvent dans le contrôle ListView.


<asp:XmlDataSource ID="XmlDataSource1" runat="server" 
                   XPath="Products/Product">
  <Data>
    <Products>
      <Product ProductID="1"  ProductName="Chai" />
      <Product ProductID="34" ProductName="Ale" />
      <Product ProductID="43" ProductName="Coffee" />
    </Products>
  </Data>
</asp:XmlDataSource>

<asp:ListView ID="ListView1" 
              ClientIDMode="Predictable" 
              ClientIDRowSuffix="ProductID"  
              DataSourceID="XmlDataSource1" runat="server" >
  <ItemTemplate>
    ProductID: 
    <asp:Label ID="ProductIDLabel" runat="server" 
               Text='<%# Eval("ProductID") %>' />
    <br />
    ProductName:
    <asp:Label ID="ProductNameLabel" runat="server" 
               Text='<%# Eval("ProductName") %>' />
    <br />
    <br />
  </ItemTemplate>

  <LayoutTemplate>
    <div ID="itemPlaceholderContainer" runat="server">
      <span ID="itemPlaceholder" runat="server" />
    </div>
    <div>
    </div>
  </LayoutTemplate>

</asp:ListView>


Quelle que soit la valeur affectée à la propriété ClientIDMode du contrôle ListView, les valeurs UniqueID des contrôles ProductIDLabel sont les suivantes :

  • UniqueID:

    • ListView1$ctrl0$ProductIDLabel

    • ListView1$ctrl1$ProductIDLabel

    • ListView1$ctrl2$ProductIDLabel

Lorsque vous affectez à la propriété ClientIDMode du contrôle ListView la valeur AutoID, les valeurs ClientID suivantes sont générées pour les contrôles ProductIDLabel :

  • ClientID:

    • ListView1_ctrl0_ProductIDLabel

    • ListView1_ctrl1_ProductIDLabel

    • ListView1_ctrl2_ProductIDLabel

Lorsque vous affectez à la propriété ClientIDMode du contrôle ListView la valeur Static, les valeurs ClientID suivantes sont générées pour les contrôles ProductIDLabel :

  • ClientID:

    • ProductIDLabel

    • ProductIDLabel

    • ProductIDLabel

Lorsque vous affectez à la propriété ClientIDMode du contrôle ListView la valeur Predictable, avec ClientIDRowSuffix qui a la valeur ProductID, les valeurs ClientID suivantes sont générées pour les contrôles ProductIDLabel :

  • ClientID:

    • ListView1_ProductIDLabel_1

    • ListView1_ProductIDLabel_34

    • ListView1_ProductIDLabel_43

Cet exemple montre un contrôle lié aux données qui se trouve dans une page Web. Lorsque vous placez un contrôle lié aux données dans un contrôle utilisateur, la partie de la valeur ClientID qui précède la valeur ID du contrôle varie en fonction de la page sur laquelle le contrôle utilisateur se trouve ou du contrôle contenant dans lequel elle se trouve. Cela rend les valeurs ClientID imprévisibles, même si vous affectez à la propriété ClientIDMode la valeur Predictable. Pour y remédier, vous pouvez affecter au ClientIDMode du contrôle conteneur parent du contrôle lié aux données la valeur Static. Lorsque vous affectez au ClientIDMode d'un contrôle conteneur la valeur Static et que vous affectez à la propriété ClientIDMode d'un contrôle lié aux données se trouvant à l'intérieur la valeur Predictable, les valeurs ClientID générées pour le contrôle lié aux données commencent toujours par l'ID du contrôle conteneur, quels que soient le ou les contrôles dans lesquels le contrôle conteneur se trouve.

Pour utiliser des contrôles dans le code, vous pouvez obtenir une référence au contrôle à l'aide de l'une de ses propriétés ID.

Référencement de contrôles par ID

Dans le code qui s'exécute sur un serveur Web, vous pouvez référencer directement un contrôle par sa propriété ID lorsque le contrôle ne se trouve pas dans un contrôle de données à répétition. Pour plus d'informations, consultez Comment : accéder à des contrôles serveur par ID.

Si la page contient des contrôles qui sont générés au moment de l'exécution (ceux qui se trouvent dans un modèle de contrôles DataList, Repeater ou GridView, par exemple), vous ne pouvez pas les référencer directement par la valeur dans la propriété ID, car l'ID n'est pas unique. Dans la classe code-behind de la page, vous pouvez à la place appeler la méthode FindControl du contrôle qui est le conteneur du contrôle que vous souhaitez référencer. Pour plus d'informations, consultez Comment : accéder à des contrôles serveur par ID.

Pour accéder à un contrôle par ID dans le script client, vous devez utiliser la méthode document.getElementById et vous devez connaître la valeur de la propriété ClientID. Pour plus d'informations, consultez Comment : accéder à des contrôles à partir de JavaScript par ID.

Cela vous a-t-il été utile ?
(1500 caractères restants)
Contenu de la communauté Ajouter
Annotations FAQ