Comment : utiliser Dynamic Data ASP.NET dans des contrôles liés aux données basés sur des modèles
Mise à jour : novembre 2007
Vous pouvez utiliser Dynamic Data ASP.NET avec des contrôles liés aux données qui utilisent des modèles tels que ListView, FormView et Repeater. En utilisant des modèles, vous pouvez avoir le contrôle total de la disposition et de l'apparence des données dans le contrôle, mais les pages sont spécifiques à la table avec laquelle vous travaillez puisque les modèles ne peuvent pas générer automatiquement de colonnes. Cela est utile lorsque vous souhaitez créer des pages personnalisées qui utilisent des fonctionnalités de Dynamic Data avec des contrôles liés aux données basés sur des modèles.
Lorsque vous travaillez avec des contrôles liés aux données basés sur des modèles, vous pouvez ajouter le contrôle DynamicControl à vos modèles pour utiliser les fonctionnalités de Dynamic Data. Lorsque vous utilisez un contrôle DynamicControl, vous tirez parti des fonctionnalités de Dynamic Data suivantes :
restitution automatique du contrôle adéquat pour un champ, selon le type de données ;
modèles de contrôles pour restituer chaque type de données, qui peuvent être modifiés globalement pour l'application entière ;
validation des données intégrée basée sur le schéma de base de données ;
personnalisation de la restitution des données pour des champs individuels en utilisant des attributs dans le modèle de données ou en utilisant la propriété UIHint. Pour plus d'informations, consultez Vue d'ensemble des modèles de données Dynamic Data ASP.NET et Comment : personnaliser l'apparence et le comportement d'un champ de données dans un contrôle Dynamic Data respectivement.
En plus d'utiliser le contrôle DynamicControl dans des contrôles liés aux données basés sur des modèles, vous pouvez l'utiliser dans un champ TemplateField d'un contrôle GridView ou DetailsView.
Exécutez un exemple en ligne de cette fonctionnalité.
Pour ajouter un contrôle DynamicControl pour afficher des données
Ajoutez un contrôle DynamicControl à l'un des modèles du contrôle lié aux données.
Remarque : En général, vous ajoutez des champs en lecture seule dans le modèle ItemTemplate de contrôle basé sur un modèle, parce que c'est le modèle chargé d'afficher les données. Toutefois, vous pouvez également ajouter un champ en lecture seule à d'autres modèles lorsque vous ne souhaitez pas que la valeur de champ soit modifiée.
Affectez à la propriété DataField le nom de la colonne que vous souhaitez afficher, comme le montre l'exemple suivant :
<asp:DynamicControl DataField="ProductName" />
Remarque : La valeur par défaut pour la propriété Mode est ReadOnly, donc vous n'avez pas à configurer cette propriété pour afficher des données uniquement.
Répétez les étapes précédentes pour chaque champ de données que vous souhaitez afficher.
Pour ajouter un contrôle DynamicControl pour les opérations de modification
Ajoutez un contrôle DynamicControl au modèle EditItemTemplate du contrôle lié aux données ou du champ de modèle.
Affectez à la propriété DataField le nom de la colonne que vous souhaitez modifier.
Affectez à la propriété Mode la valeur Edit, comme dans l'exemple suivant :
<asp:DynamicControl DataField="ProductName" Mode="Edit" />
Répétez les étapes précédentes pour chaque champ de données que vous souhaitez modifier.
Pour ajouter un contrôle DynamicControl pour les opérations d'insertion
Ajoutez un contrôle DynamicControl au modèle InsertItemTemplate du contrôle lié aux données ou du champ de modèle.
Affectez comme valeur à la propriété DataField le nom de la colonne dans laquelle vous souhaitez insérer des données.
Affectez à la propriété Mode la valeur Insert, comme dans l'exemple suivant :
<asp:DynamicControl DataField="ProductName" Mode="Insert" />
Répétez les étapes précédentes pour chaque champ de données dans lequel vous souhaitez insérer des données.
Exemple
L'exemple suivant illustre un contrôle FormView qui utilise des contrôles DynamicControl pour créer une page personnalisée qui utilise des fonctionnalités de Dynamic Data.
<%@ Page Language="VB" %>
<script >
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
DynamicDataManager1.RegisterControl(FormView1)
End Sub
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head >
<title>DynamicControl and Templated Data-Bound Controls Sample</title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" >
<div>
<h2>Address Table</h2>
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<asp:FormView ID="FormView1"
DataSourceID="FormDataSource"
AllowPaging="true">
<ItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="New" CausesValidation="false" Text="New" />
<asp:LinkButton ID="EditButton" CommandName="Edit" CausesValidation="false" Text="Edit" />
<asp:LinkButton ID="DeleteButton" CommandName="Delete" CausesValidation="false" Text="Delete" />
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Edit" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Edit" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Edit" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Edit" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Edit" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Edit" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton" CommandName="Update">Update</asp:LinkButton>
<asp:LinkButton ID="CancelEditButton" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Insert" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Insert" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Insert" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Insert" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Insert" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Insert" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="Insert" Text="Insert" />
<asp:LinkButton ID="CancelInsertButton" CommandName="Cancel" CausesValidation="false" Text="Cancel" />
</td>
</tr>
</table>
</InsertItemTemplate>
<PagerSettings Position="Bottom" Mode="NumericFirstLast" />
</asp:FormView>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorksLT sample database. -->
<asp:LinqDataSource ID="FormDataSource"
TableName="Addresses"
ContextTypeName="AdventureWorksLTDataContext"
EnableDelete="true"
EnableInsert="true"
EnableUpdate="true">
</asp:LinqDataSource>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<script >
protected void Page_Init(object sender, EventArgs e) {
DynamicDataManager1.RegisterControl(FormView1);
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head >
<title>DynamicControl and Templated Data-Bound Controls Sample</title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" >
<div>
<h2>Address Table</h2>
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<asp:FormView ID="FormView1"
DataSourceID="FormDataSource"
AllowPaging="true">
<ItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="New" CausesValidation="false" Text="New" />
<asp:LinkButton ID="EditButton" CommandName="Edit" CausesValidation="false" Text="Edit" />
<asp:LinkButton ID="DeleteButton" CommandName="Delete" CausesValidation="false" Text="Delete" />
</td>
</tr>
</table>
</ItemTemplate>
<EditItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Edit" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Edit" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Edit" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Edit" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Edit" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Edit" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton" CommandName="Update">Update</asp:LinkButton>
<asp:LinkButton ID="CancelEditButton" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton>
</td>
</tr>
</table>
</EditItemTemplate>
<InsertItemTemplate>
<table>
<tr>
<td>Address Line 1:</td>
<td>
<asp:DynamicControl DataField="AddressLine1" Mode="Insert" />
</td>
</tr>
<tr>
<td>Address Line 2:</td>
<td>
<asp:DynamicControl DataField="AddressLine2" Mode="Insert" />
</td>
</tr>
<tr>
<td>City:</td>
<td>
<asp:DynamicControl DataField="City" Mode="Insert" />
</td>
</tr>
<tr>
<td>State/Province:</td>
<td>
<asp:DynamicControl DataField="StateProvince" Mode="Insert" />
</td>
</tr>
<tr>
<td>Country:</td>
<td>
<asp:DynamicControl DataField="CountryRegion" Mode="Insert" />
</td>
</tr>
<tr>
<td>Postal Code:</td>
<td>
<asp:DynamicControl DataField="PostalCode" Mode="Insert" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="InsertButton" CommandName="Insert" Text="Insert" />
<asp:LinkButton ID="CancelInsertButton" CommandName="Cancel" CausesValidation="false" Text="Cancel" />
</td>
</tr>
</table>
</InsertItemTemplate>
<PagerSettings Position="Bottom" Mode="NumericFirstLast" />
</asp:FormView>
<!-- This example uses Microsoft SQL Server and connects -->
<!-- to the AdventureWorksLT sample database. -->
<asp:LinqDataSource ID="FormDataSource"
TableName="Addresses"
ContextTypeName="AdventureWorksLTDataContext"
EnableDelete="true"
EnableInsert="true"
EnableUpdate="true">
</asp:LinqDataSource>
</div>
</form>
</body>
</html>
Compilation du code
Cet exemple nécessite :
Site Web Dynamic Data ou application Web Dynamic Data.
Exemple de base de données AdventureWorks ou AdventureWorksLT. Pour plus d'informations sur le téléchargement et l'installation de l'exemple SQL Server, consultez Exemples de produits Microsoft SQL Server : Base de données (en anglais) sur le site CodePlex. Prenez soin d'installer la version appropriée de l'exemple de base de données pour la version de SQL Server que vous exécutez (SQL Server 2005 ou SQL Server 2008).
Classe LINQ to SQL configurée pour accéder à la table Address de la base de données AdventureWorks ou AdventureWorksLT.
Le contexte de données est enregistré avec le moteur Dynamic Data dans le fichier Global.asax.
Les colonnes rowguid et ModifiedData de la table Address sont configurées pour être automatiquement générées dans le concepteur Objet/Relationnel. En d'autres termes, assurez-vous que la propriété IsDbGenerated pour ces deux colonnes a la valeur true. Cela est uniquement requis pour les opérations d'insertion.
Programmation fiable
Les conditions ci-dessous peuvent générer une exception.
- La base de données n'est pas disponible
Voir aussi
Concepts
Vue d'ensemble de Dynamic Data ASP.NET
Vue d'ensemble des modèles de données Dynamic Data ASP.NET