Vue d'ensemble des expressions de liaison de données

Mise à jour : novembre 2007

La syntaxe de liaison de données vous autorise à lier aux données des valeurs de propriété du contrôle et à spécifier des valeurs servant à récupérer, mettre à jour, supprimer et insérer des données.

Syntaxe de liaison de données

Les expressions de liaison de données sont contenues dans les délimiteurs <%# et %> et utilisent les fonctions Eval et Bind. La fonction Eval sert à définir une liaison unidirectionnelle (en lecture seule). La fonction Bind sert à une liaison bidirectionnelle (actualisable). En plus d'appeler les méthodes Eval et Bind pour exécuter la liaison de données dans une expression de liaison de données, vous pouvez appeler tout code de portée publiquement limitée par les délimiteurs <%# et %> afin d'exécuter ce code et de retourner une valeur pendant le traitement de la page.

Les expressions de liaison de données sont résolues lorsque la méthode DataBind d'un contrôle ou de la classe Page est appelée. Pour des contrôles tels que GridView, DetailsView et FormView, les expressions de liaison de données sont résolues automatiquement pendant l'événement PreRender du contrôle et vous n'êtes pas tenu d'appeler explicitement la méthode DataBind.

L'exemple de code suivant montre l'utilisation d'expressions de liaison de données avec un contrôle FormView dans un ItemTemplate.

<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                   
</asp:FormView>
<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                 
</asp:FormView>

Utilisation de la méthode Eval

La méthode Eval évalue des expressions de données à liaison tardive dans des modèles de contrôles liés aux données, tels que les contrôles GridView, DetailsView et FormView. Au moment de l'exécution, la méthode Eval appelle la méthode Eval de l'objet DataBinder, référençant l'élément de données actuel du conteneur de dénomination (naming container). Le conteneur de dénomination est en général la plus petite partie d'un contrôle lié aux données contenant un enregistrement entier, par exemple une ligne dans un contrôle GridView. Vous ne pouvez donc utiliser la méthode Eval que pour lier à l'intérieur des modèles d'un contrôle lié aux données.

La méthode Eval prend le nom d'un champ de données et retourne une chaîne contenant la valeur de ce champ à partir de l'enregistrement actuellement présent dans la source de données. Vous pouvez fournir un deuxième paramètre facultatif pour spécifier le format de la chaîne retournée. Le paramètre du format de chaîne utilise la syntaxe définie pour la méthode Format de la classe String.

Utilisation de la méthode Bind

La méthode Bind présente certaines ressemblances avec la méthode Eval, tout en comportant des différences notables. Bien que vous puissiez récupérer les valeurs des champs liés aux données à l'aide de la méthode Bind, comme d'ailleurs avec la méthode Eval, vous pouvez également utiliser la méthode Bind lorsque les données peuvent être modifiées.

Dans ASP.NET, les contrôles liés aux données, comme GridView, DetailsView et FormView, peuvent utiliser automatiquement les opérations de mise à jour, d'élimination et d'insertion d'un contrôle de source de données. Par exemple, si vous avez défini des instructions SQL Select, Insert, Delete et Update pour votre contrôle de source de données, l'utilisation de Bind dans un modèle de contrôle GridView, DetailsView ou FormView permettra au contrôle d'extraire des valeurs de contrôles enfants dans le modèle et de les passer au contrôle de source de données. Le contrôle de source de données exécute ensuite la commande appropriée pour la base de données. C'est pour cette raison que la fonction Bind est utilisée à l'intérieur du EditItemTemplate ou InsertItemTemplate d'un contrôle lié aux données.

La méthode Bind est en général utilisée avec des contrôles d'entrée, tels que le contrôle TextBox, rendus par une ligne GridView en mode Édition. Lorsque le contrôle lié aux données crée ces contrôles d'entrée dans le cadre de son propre rendu, il peut extraire les valeurs d'entrée.

La méthode Bind prend le nom d'un champ de données à associer à la propriété liée, comme dans l'exemple suivant :

Note de sécurité :

Cet exemple a une zone de texte qui accepte l'entrée d'utilisateur, ce qui constitue une menace éventuelle pour la sécurité. Par défaut, les pages Web ASP.NET vérifient que les entrées d'utilisateur n'incluent pas de script ou d'éléments HTML. Pour plus d'informations, consultez Vue d'ensemble des attaques de script.

<EditItemTemplate>
  <table>
    <tr>
      <td align=right>
        <b>Employee ID:</b>
      </td>
      <td>
        <%# Eval("EmployeeID") %>
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>First Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
          Text='<%# Bind("FirstName") %>' />
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>Last Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
            Text='<%# Bind("LastName") %>'  />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:LinkButton ID="UpdateButton" RunAt="server"
          Text="Update" CommandName="Update" />
        &nbsp;
        <asp:LinkButton ID="CancelUpdateButton" RunAt="server"
          Text="Cancel" CommandName="Cancel" />
      </td>
    </tr>
  </table>
</EditItemTemplate>

Lorsque l'on clique sur le bouton Update de la ligne, les valeurs de chaque propriété du contrôle liée à l'aide de la syntaxe Bind sont extraites et passées au contrôle de source de données pour l'opération de mise à jour.

Appel explicite de la méthode DataBind

Les contrôles tels que GridView, FormView et DetailsView exécutent la liaison en appelant implicitement la méthode DataBind lorsqu'ils sont liés à un contrôle de source de données à l'aide de la propriété DataSourceID. Toutefois, il existe des situations dans lesquelles vous devrez appeler la méthode DataBind explicitement.

Ce sera le cas, par exemple, si vous avez lié un contrôle à un contrôle de source de données à l'aide de la propriété DataSource au lieu de la propriété DataSourceID. Dans ce cas, vous devrez appeler explicitement la méthode DataBind pour exécuter la liaison de données et résoudre les expressions de liaison de données.

Il en sera de même si vous devez actualiser les données manuellement dans un contrôle lié aux données. Imaginez une page contenant deux contrôles qui affichent des informations provenant de la même base de données (peut-être en utilisant des vues différentes). Vous pourrez alors avoir besoin de lier explicitement à nouveau le contrôle aux données pour que l'affichage des données reste synchronisé. Par exemple, vous pouvez avoir un contrôle GridView qui affiche une liste de produits et un contrôle DetailsView qui autorise les utilisateurs à modifier les produits. Bien que les contrôles GridView et DetailsView affichent des données provenant de la même source, ils sont liés à des contrôles de source de données différents parce qu'ils utilisent des requêtes différentes pour obtenir leurs données. Un utilisateur peut mettre à jour un enregistrement à l'aide du contrôle DetailsView, déclenchant ainsi la mise à jour qui sera effectuée par le contrôle de source de données associé. Cependant, le contrôle GridView étant lié à un contrôle de source de données différent, il affichera les anciennes valeurs d'enregistrement jusqu'à ce que la page soit actualisée. Par conséquent, une fois que les données auront été mises à jour par le contrôle DetailsView, vous pourrez appeler la méthode DataBind. Cela déclenchera pour le contrôle GridView la mise à jour de son affichage, ce dont il s'acquittera en réexécutant toutes les expressions de liaison de données, ainsi que le code de portée publiquement limitée par les délimiteurs <%# et %>. Le contrôle GridView répercutera donc la mise à jour effectuée par le contrôle DetailsView.

Utilisation de la liaison pour une table de correspondance

Un scénario courant avec les contrôles liés aux données est de permettre aux utilisateurs de mettre à jour ou d'insérer une valeur en la sélectionnant dans une table de correspondance à l'aide d'un contrôle DropDownList ou d'un autre contrôle de liste. Dans ce cas, le contrôle de correspondance est lié à une source de données séparée qui retourne la liste des valeurs possibles, et la valeur sélectionnée du contrôle de correspondance est liée à un champ dans la ligne liée aux données parente.

Vous pouvez ajouter ces fonctionnalités comme suit. En premier lieu, pour le contrôle de correspondance, vous ajoutez un contrôle de liste (contrôle DropDownList ou ListBox) à un modèle dans un contrôle lié aux données, tel qu'un contrôle GridView, DetailsView ou FormView. Vous liez la propriété SelectedValue du contrôle de correspondance au champ connexe dans la source de données du contrôle conteneur. Ensuite, vous affectez un contrôle de source de données qui récupère les valeurs de correspondance à la propriété DataSourceID du contrôle de correspondance. Vous affectez le champ de la table de correspondance qui contient les valeurs à afficher à la propriété DataTextField du contrôle de correspondance et le champ de la table de correspondance qui contient l'identificateur unique pour la valeur de correspondance, si applicable, à la propriété DataValueField.

L'exemple de code suivant affiche un contrôle DropDownList qui est inclus dans le modèle InsertItemTemplate d'un contrôle FormView (il peut également s'agir d'un modèle InsertItemTemplate d'un TemplateField inclus dans la propriété Fields d'un contrôle DetailsView ou la propriété Columns d'un contrôle GridView). La propriété SelectedValue du contrôle DropDownList utilise la méthode Bind pour la liaison bidirectionnelle au champ CategoryID de la ligne actuelle pour le contrôle FormView. La propriété DataSourceID du contrôle DropDownList a pour valeur un contrôle de source de données séparé qui récupère la liste des noms de catégories et d'ID possibles. La propriété DataTextField du contrôle DropDownList a pour valeur le champ CategoryName de la source de données de correspondance afin d'afficher une liste des noms de catégories possibles. La propriété DataValueField du contrôle DropDownList a pour valeur le champ CategoryID de la source de données de correspondance pour le nom de catégorie connexe. Lorsqu'un utilisateur sélectionne un nom de catégorie dans la liste, la propriété SelectedValue du contrôle DropDownList a pour valeur l'ID de catégorie pour le nom de catégorie sélectionné.

<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>
<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>

Le même contrôle de liste pourrait également être utilisé dans un modèle de modification d'élément.

Voir aussi

Tâches

Comment : établir une liaison vers les données d'un contrôle basé sur des modèles

Concepts

Liaison à des bases de données

Liaison à des objets métier

Liaison à des données hiérarchiques

Vue d'ensemble de l'accès aux données ASP.NET