Procedura: utilizzare ASP.NET Dynamic Data nei controlli con associazione a dati e basati su modelli
Aggiornamento: novembre 2007
È possibile utilizzare ASP.NET Dynamic Data con controlli con associazione a dati che utilizzano modelli quali ListView, FormView e Repeater. Utilizzando i modelli, è possibile avere un controllo completo sul layout e l'aspetto dei dati nel controllo, ma le pagine sono specifiche per la tabella che si utilizza dal momento che i modelli non possono generare automaticamente colonne. Ciò si rivela utile quando si desidera creare pagine personalizzate che utilizzano le funzionalità di Dynamic Data con i controlli con associazione a dati basati su modelli.
Quando si utilizzano controlli con associazione a dati basati su modelli, è possibile aggiungere il controllo DynamicControl ai modelli per avvalersi delle funzionalità di Dynamic Data . Quando si utilizza un controllo DynamicControl, è possibile sfruttare le seguenti funzionalità di Dynamic Data:
Rendering automatico del controllo appropriato di un campo in base al tipo di dati.
Controllo dei modelli per l'esecuzione del rendering di ogni tipo di dati che può essere modificato a livello globale per l'intera applicazione.
Convalida dei dati incorporati in base allo schema del database.
Personalizzazione del rendering dei dati per i singoli campi tramite gli attributi nel modello dati o tramite la proprietà UIHint. Per ulteriori informazioni, vedere rispettivamente Cenni preliminari sul modello di ASP.NET Dynamic Data e Procedura: personalizzare l'aspetto e il comportamento dei campi dati di un controllo Dynamic Data.
Oltre a utilizzare il controllo DynamicControl nei controlli con associazione a dati basati su modelli, è possibile utilizzarlo in un campo TemplateField di un controllo GridView o DetailsView.
Run un esempio in linea di questa funzionalità (informazioni in lingua inglese).
Per aggiungere un controllo DynamicControl per visualizzare i dati
Aggiungere un controllo DynamicControl a uno dei modelli del controllo con associazione a dati.
Nota: In genere nel modello ItemTemplate dei controlli basati su modelli è possibile aggiungere campi di sola lettura perché si tratta del modello responsabile della visualizzazione dei dati. È tuttavia possibile aggiungere un campo di sola lettura agli altri modelli quando non si desidera che il valore del campo venga modificato.
Impostare la proprietàDataField sul nome della colonna che si desidera visualizzare, come illustrato nell'esempio seguente:
<asp:DynamicControl DataField="ProductName" />
Nota: Il valore predefinito per la proprietà Mode è ReadOnly, pertanto non è necessario impostare questa proprietà per visualizzare solo i dati.
Ripetere i passaggi precedenti per ogni campo dati che si desidera visualizzare.
Per aggiungere un controllo DynamicControl per le operazioni di modifica
Aggiungere un controllo DynamicControl al modello EditItemTemplate del controllo con associazione a dati o al campo modello.
Impostare la proprietà DataField sul nome della colonna che si desidera modificare.
Impostare la proprietà Mode su Edit, come mostrato nell'esempio seguente:
<asp:DynamicControl DataField="ProductName" Mode="Edit" />
Ripetere i passaggi precedenti per ogni campo dati che si desidera modificare.
Per aggiungere un controllo DynamicControl per le operazioni di inserimento
Aggiungere un controllo DynamicControl al modello InsertItemTemplate del controllo con associazione a dati o al campo modello.
Impostare la proprietà DataField sul nome della colonna per cui si desidera inserire i dati.
Impostare la proprietà Mode su Insert, come mostrato nell'esempio seguente:
<asp:DynamicControl DataField="ProductName" Mode="Insert" />
Ripetere i passaggi precedenti per ogni campo dati per cui si desidera inserire i dati.
Esempio
Nell'esempio seguente viene mostrato un controllo FormView che utilizza i controlli DynamicControl per creare una pagina personalizzata che utilizza le funzionalità di 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>
Compilazione del codice
Per questo esempio sono necessari i seguenti requisiti:
Sito Web Dynamic Data o applicazione Web Dynamic Data.
Database di esempio AdventureWorks o AdventureWorksLT. Per informazioni su come scaricare e installare il database di esempio di SQL Server, vedere Microsoft SQL Server Product Samples: Database (informazioni in lingua inglese) nel sito Web CodePlex. Assicurarsi di installare la versione del database di esempio appropriata per la versione di SQL Server in esecuzione (SQL Server 2005 o SQL Server 2008).
Classe LINQ to SQL configurata per l'accesso alla tabella di indirizzi del database AdventureWorks o AdventureWorksLT.
Il contesto dati viene registrato con il motore di Dynamic Data nel file Global.asax.
Le colonne rowguid e ModifiedData della tabella di indirizzi sono impostate per essere automaticamente generate nella Progettazione relazionale oggetti. In altre parole, verificare che la proprietà IsDbGenerated per queste due colonne sia impostata su true. Ciò è necessario solo per l'operazione di inserimento.
Programmazione efficiente
Le seguenti condizioni possono generare un'eccezione:
- Database non disponibile
Vedere anche
Concetti
Cenni preliminari su ASP.NET Dynamic Data
Cenni preliminari sul modello di ASP.NET Dynamic Data