Cenni preliminari sulle pagine di supporto temporaneo e sui modelli di pagina di ASP.NET Dynamic Data
Aggiornamento: novembre 2007
Un'attività ricorrente nello sviluppo di programmi software consiste nella visualizzazione e modifica di dati. ASP.NET Dynamic Data consente di creare applicazioni basate sui dati con una quantità minima di codice o senza codice. Il meccanismo delle pagine di supporto temporaneo costituisce un'importante funzionalità di Dynamic Data che consente di generare rapidamente queste applicazioni.
Vengono illustrati i seguenti argomenti:
Pagine di supporto temporaneo
Modelli di pagina
Pagine di supporto temporaneo
Le pagine di supporto temporaneo sono un meccanismo che sfrutta la potenza e le funzionalità del framework di pagina ASP.NET esistente e le migliora con una visualizzazione dinamica delle pagine basata sul modello dati senza che sia necessaria una pagina fisica in background.
I vantaggi dell'utilizzo del meccanismo delle pagine di supporto temporaneo sono i seguenti:
Creazione di un'applicazione Web basata sui dati con una quantità minima di codice o senza codice.
Tempi rapidi di sviluppo.
Le pagine sono completamente funzionali. Includono tutte le operazioni del database (di visualizzazione, inserimento, modifica ed eliminazione) nonché funzionalità di ordinamento e paging.
Convalida dei dati incorporati in base allo schema del database.
I filtri automatici vengono creati per ogni campo di chiave esterna o booleano.
Dynamic Data utilizza il routing degli URL per associare e gestire le richieste. Il meccanismo delle pagine di supporto temporaneo deduce la visualizzazione e la tabella che un utente desidera vedere in base all'URL richiesto. Il vantaggio dell'utilizzo del meccanismo di routing consiste nel fatto che l'URL richiesto non deve corrispondere al percorso fisico dell'applicazione.
Attivazione del meccanismo delle pagine di supporto temporaneo.
Per impostazione predefinita, il meccanismo delle pagine di supporto temporaneo è disattivato. L'attivazione del meccanismo delle pagine di supporto temporaneo deve essere eseguita prestando particolare attenzione perché può causare problemi di sicurezza in quanto può esporre l'intero modello dati consentendo operazioni di visualizzazione, modifica, inserimento ed eliminazione.
È possibile utilizzare i seguenti approcci per attivare il meccanismo delle pagine di supporto temporaneo:
Attivazione nella registrazione del contesto dati.
Utilizzando l'attributo ScaffoldTableAttribute.
Utilizzando l'attributo ScaffoldColumnAttribute.
È necessario registrare il contesto dati che utilizzerà le funzionalità di Dynamic Data, anche se non si intende utilizzare il meccanismo delle pagine di supporto temporaneo. Questa registrazione viene effettuata nel file global.asax tramite il metodo RegisterContext. Il metodo RegisterContext accetta un oggetto ContextConfiguration come parametro. Per attivare il meccanismo delle pagine di supporto temporaneo durante la registrazione del contesto dati, impostare la proprietà ScaffoldAllTables dell'oggetto ContextConfiguration su true. Ciò consentirà di attivare il meccanismo delle pagine di supporto temporaneo per l'intero modello dati. In altre parole, esporrà tutte le tabelle presenti nel modello dati consentendo operazioni di visualizzazione, modifica, inserimento ed eliminazione. Se è necessario nascondere alcune tabelle dal meccanismo delle pagine di supporto temporaneo, è sufficiente utilizzare l'attributo ScaffoldTableAttribute.
Nell'esempio seguente viene mostrato come attivare il meccanismo delle pagine di supporto temporaneo per tutte le tabelle presenti nel modello dati durante la registrazione del contesto dati per il database AdventureWorksLT.
model.RegisterContext(GetType(AdventureWorksLTDataContext), _
New ContextConfiguration() With {.ScaffoldAllTables = True})
model.RegisterContext(typeof(AdventureWorksLTDataContext),
new ContextConfiguration() { ScaffoldAllTables = true });
Se si desidera un maggiore controllo su quali tabelle vengono esposte, è possibile utilizzare l'attributo ScaffoldTableAttribute per attivare o disattivare il meccanismo delle pagine di supporto temporaneo per una determinata tabella. Anziché esporre l'intero modello dati e nascondere le tabelle che non devono essere esposte, è possibile esporre solo quelle richieste dall'applicazione. Per applicare l'attributo ScaffoldTableAttribute, è necessario creare una classe parziale che abbia lo stesso nome della classe di entità nel modello dati, quindi applicare l'attributo alla classe parziale.
Nell'esempio seguente viene mostrato come attivare il meccanismo delle pagine di supporto temporaneo per una singola tabella.
Imports System.ComponentModel.DataAnnotations
<ScaffoldTable(True)> _
Partial Public Class Product
End Class
using System.ComponentModel.DataAnnotations;
[ScaffoldTable(true)]
public partial class Product {
}
Se si desidera un maggiore controllo su quali campi dati vengono esposti, è possibile utilizzare l'attributo ScaffoldColumnAttribute per attivare o disattivare il meccanismo delle pagine di supporto temporaneo per un determinato campo dati.
Per impostazione predefinita, non tutti i campi dati vengono visualizzati da Dynamic Data. Di seguito vengono riportate alcune regole importanti utilizzate da Dynamic Data per visualizzare o meno un campo dati:
Se al campo dati viene applicato l'attributo ScaffoldColumnAttribute, viene visualizzato. Questa regola esegue l'override di tutte le seguenti regole.
Se al campo dati viene applicato l'attributo UIHintAttribute, viene visualizzato. Questa regola esegue l'override di tutte le seguenti regole.
Se il campo dati è un campo di chiave esterna, non viene visualizzato. Ciò si verifica perché Dynamic Data gestisce i campi di chiave esterna in modo diverso e in genere non visualizza il valore del campo di chiave esterna.
Se il campo dati viene automaticamente generato nel database, non viene visualizzato. In genere questo tipo di campo non contiene informazioni rilevanti. Assicurarsi di applicare l'attributo UIHintAttribute al campo dati, se deve essere visualizzato.
Se il valore della proprietà IsCustomProperty è true, il campo dati non viene visualizzato.
Per applicare l'attributo ScaffoldColumnAttribute, è necessario creare una classe di metadati associata in cui l'attributo ScaffoldColumnAttribute verrà applicato al campo dati e una classe parziale che abbia lo stesso nome della classe di entità presente nel modello dati. Quindi, è necessario associare queste due classi applicando l'attributo MetadataTypeAttribute alla classe parziale.
Nell'esempio seguente viene mostrato come nascondere determinati campi dati, PasswordHash e PasswordSalt, dal meccanismo delle pagine di supporto temporaneo.
Imports System.ComponentModel.DataAnnotations
<MetadataType(GetType(Customer_Metadata))> _
Partial Public Class Customer
End Class
Public Class Customer_Metadata
<ScaffoldColumn(False)> _
Public PasswordHash As Object
<ScaffoldColumn(False)> _
Public PasswordSalt As Object
End Class
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(Customer_Metadata))]
public partial class Customer
{
}
public class Customer_Metadata
{
[ScaffoldColumn(false)]
public object PasswordHash;
[ScaffoldColumn(false)]
public object PasswordSalt;
}
Modelli di pagina
Il meccanismo delle pagine di supporto temporaneo di ASP.NET Dynamic Data utilizza i modelli per fornire le visualizzazioni predefinite dei dati. I modelli sono pagine ASP.NET normali, il che significa che è possibile modificare i modelli e influire sull'aspetto e il comportamento delle pagine generate in tutta l'applicazione Web.
Quando si crea un'applicazione di ASP.NET Dynamic Data, il modello di progetto aggiunge una cartella DynamicData al progetto. Nella tabella seguente sono elencati i modelli di pagina forniti da Dynamic Data nella cartella DynamicData\PageTemplates:
Nome modello di pagina |
Descrizione |
---|---|
Details.aspx |
Fornisce una visualizzazione dettagliata di una sola riga del database. Utilizza un controllo DetailsView per visualizzare i dati. Si tratta del modello predefinito utilizzato per l'operazione di selezione. |
Edit.aspx |
Fornisce un'interfaccia per la modifica di una sola riga di una tabella di database. Utilizza un controllo DetailsView per modificare i dati. Si tratta del modello predefinito utilizzato per l'operazione di modifica. |
Insert.aspx |
Fornisce un'interfaccia per l'inserimento di una sola riga in una tabella di database. Utilizza un controllo DetailsView per inserire i dati. Si tratta del modello predefinito utilizzato per l'operazione di inserimento. |
List.aspx |
Visualizza un elenco di righe di una tabella di database. Fornisce i controlli DropDownList per il filtraggio di dati per ogni colonna di chiave esterna o booleana e funzionalità di ordinamento e paging. Utilizza un controllo GridView per l'elenco di righe. Si tratta del modello predefinito utilizzato per l'operazione di visualizzazione. |
ListDetails.aspx |
Visualizza un elenco di righe di una tabella di database. Fornisce i controlli DropDownList per il filtraggio di dati per ogni colonna di chiave esterna o booleana e funzionalità di ordinamento e paging. Il modello utilizza un controllo GridView per l'elenco di righe e un controllo DetailsView per la riga selezionata e l'inserimento di un nuovo record. Si tratta di un modello che presenta una funzionalità tutto-in-una. Non è utilizzato per impostazione predefinita, ma è possibile modificare la configurazione nel file Global.asax per utilizzare invece questo modello. |
Tutti i modelli predefiniti forniti da Dynamic Data hanno in comune le funzionalità seguenti:
Utilizzano una pagina master denominata Site.master che si trova nella cartella radice. La pagina master definisce i fogli di stile e un'intestazione di base e include anche un controllo ScriptManager per attivare la funzionalità AJAX nel sito Web. Per l'esecuzione del debug, è necessario disattivare gli aggiornamenti parziali della pagina, impostando la proprietà EnablePartialRendering del controllo ScriptManager su false. Per ulteriori informazioni, vedere la classe Aggiunta di funzionalità AJAX e client.
Ciascun modello della pagina contiene un controllo UpdatePanel per attivare il rendering parziale senza un postback. Per ulteriori informazioni, vedere la classe Sintassi dichiarativa per il controllo server Web UpdatePanel.
Ciascun modello della pagina contiene inoltre un controllo DynamicDataManager per aggiungere un comportamento dinamico ai controlli origine dati e con associazione a dati presenti nel modello.
Personalizzazione dei modelli di pagina
Dynamic Data consente di personalizzare i modelli forniti. A tale scopo, è possibile procedere in due modi diversi:
Personalizzazione dei modelli di pagina incorporati.
Personalizzazione del layout per una determinata tabella.
È possibile personalizzare i modelli di pagina incorporati modificando le pagine che si trovano nella cartella DynamicData\PageTemplates. Le modifiche apportate in questo percorso influiscono sull'aspetto e il comportamento delle pagine generate che utilizzano il meccanismo delle pagine di supporto temporaneo in tutta l'applicazione Web.
È possibile utilizzare il meccanismo delle pagine di supporto temporaneo e creare pagine personalizzate per tabelle specifiche. A questo scopo, è necessario creare una cartella nella cartella DynamicData\CustomPages con lo stesso nome della tabella di entità nel modello dati. In questa nuova cartella, è possibile aggiungere una pagina con lo stesso nome del modello di pagina utilizzato a livello globale. Ad esempio, se si desidera creare una determinata pagina dei dettagli per una tabella, denominare la pagina come Details.aspx. È possibile utilizzare il modello di pagina incorporato come punto di partenza per la pagina personalizzata. Per un esempio, vedere Procedura: personalizzare il layout di una singola tabella mediante un modello di pagina personalizzato.
Personalizzazione delle route
Come accennato in precedenza, Dynamic Data utilizza ASP.NET per associare e gestire le richieste di URL. Le route sono definite nel file global.asax. Per impostazione predefinita, Dynamic Data utilizza un modello di pagina diverso per ogni operazione (di visualizzazione, selezione, modifica e inserimento). La funzionalità di eliminazione viene visualizzata sia nella pagina Elenco che nella pagina Dettagli, perché non è necessario un modello di pagina specifico per l'operazione di eliminazione.
È possibile personalizzare le route per visualizzare URL diversi, nonché utilizzarle per specificare modelli di pagina diversi, rimuovere l'estensione di file dall'URL o per passare parametri utilizzando le route anziché i valori della stringa di query. Per ulteriori informazioni sulle route, vedere Routing di ASP.NET.
Nell'esempio seguente viene mostrato come specificare le route per utilizzare un solo modello di pagina per tutte le operazioni. La prima route attiva tutte le operazioni in una pagina per una tabella specificata. La seconda route consente a una pagina di passare ai dettagli di un record, ad esempio di spostarsi su una tabella delle relazioni quando si dispone di un campo della chiave esterna.
routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
.Action = PageAction.List, _
.ViewName = "ListDetails", _
.Model = model})
routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
.Action = PageAction.Details, _
.ViewName = "ListDetails", _
.Model = model})
routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
Action = PageAction.List,
ViewName = "ListDetails",
Model = model
});
routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
Action = PageAction.Details,
ViewName = "ListDetails",
Model = model
});
È possibile creare anche route specifiche per tabelle specifiche, specificando un modello di pagina diverso rispetto a quello utilizzato dal resto delle tabelle. Le route vengono analizzate nell'ordine in cui sono state definite. È necessario definire prima le route più specifiche e poi quelle generiche.
Nell'esempio seguente viene mostrato come specificare un modello di pagina diverso per la tabella Products del database AdventureWorks e definirne uno generico per le altre tabelle del database.
routes.Add(New DynamicDataRoute("Products/{action}.aspx") With { _
.ViewName = "ListDetails", _
.Table = "Products", _
.Model = model})
routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _
.Constraints = New RouteValueDictionary( _
New With {.Action = "List|Details|Edit|Insert"}), _
.Model = model})
routes.Add(new DynamicDataRoute("Products/{action}.aspx")
{
ViewName = "ListDetails",
Table = "Products",
Model = model
});
routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
{
Constraints = new RouteValueDictionary(
new { action = "List|Details|Edit|Insert" }),
Model = model
});