ASP.NET Dynamic Data
» Andrea Dottor – Microsoft MVP ASP/ASP.NET
» Cosa sono gli ASP.NET Dynamic Data?
Permettono di creare una Web Application per l'accesso e la gestione dati
utilizzando un meccanismo chiamato scaffolding.
27/03/2009
www.xedotnet.org
2
Wikipedia Scaffolding
» [WIKIPEDIA] Scaffolding:
Il termine scaffolding, introdotto in psicologia da Jerome Bruner e
altri nel 1976, significa letteralmente "impalcatura". Indica quelle
strategie di sostegno e quella guida ai processi di apprendimento che
consentono di svolgere un compito sebbene non si abbiano ancora le
competenze per farlo in autonomia, riuscendovi grazie all'aiuto di un
esperto, di un adulto o di un pari più preparato che fornisce
indicazioni e suggerimenti, nell'attesa che si riesca a maturare una
piena autonomia nello svolgimento del compito.
Le componenti generali dello scaffolding sono:
a) reclutare il bambino al compito
b) mantenere la direzione dell'attività verso il problema da
risolvere
c) semplificare le componenti del compito
d) mostrare le possibili soluzioni
e) ridurre i gradi di libertà della situazione
27/03/2009
www.xedotnet.org
3
FLICKR Scaffolding
» [FLICKR] Scaffolding:
17/01/2008
www.xedotnet.org
4
Concetti base
» Concetti dei Dynamic Data
• Permettono di creare facilmente siti per l’accesso ai dati
(operazioni di CRUD)
• L’interfaccia è creata partendo dal Data Model
• Data Model fa uso dei metadati per descrivere tutta la
struttura e le relazioni
• Le regole di validazione vengono create
automaticamente
• Le pagine vengono crete automaticamente, utilizzando
dei template
• URL Routing è utilizzato per mappare gli url sulle pagine
27/03/2009
www.xedotnet.org
5
Architettura
» Architettura
Page e Field Templates
Data Source
27/03/2009
Data Model
(LINQ to SQL – Entity Framework)
www.xedotnet.org
Data Model
(Meta-data)
6
Creazione progetto
» Creazione di un progetto Dynamic Data – passo 1
Utilizzare il template “DynamicData Web Site”
Il WebSite conterrà la cartella
“DynamicData”
27/03/2009
www.xedotnet.org
7
Creazione progetto
» Creazione di un progetto Dynamic Data – passo 2
Aggiungere classi LINQ toSQL oppure Entity Data Model
27/03/2009
www.xedotnet.org
8
Creazione progetto
» Creazione di un progetto Dynamic Data – passo 3
Popoliamo il Data Model
(LINQ to SQL oppure
Entity Framework)
Drag & Drop delle tabelle
da utilizzare.
27/03/2009
www.xedotnet.org
9
Creazione progetto
» Creazione di un progetto Dynamic Data – passo 4
Configurazione del DataModel nel Global.asax per la registrazione del
DataContext necessario per la creazione del Meta Model e delle regole di routing.
MetaModelmodel = new MetaModel();
model.RegisterContext(typeof(NorthwindDataContext),
new ContextConfiguration() { ScaffoldAllTables = true });
27/03/2009
www.xedotnet.org
10
Page Templates
» Page Templates
Contenute in DynamicData\Page Templates
Page Uses Controls:
•DynamicDataManager
•DynamicValidator
•FilterRepeater
•DynamicControl
•DynamicField
GridView utilizzata per
visualizzare i dati.
27/03/2009
www.xedotnet.org
11
Page Modes
» Page Modes
Separate-Page Mode(default)
• Vengono utilizzate pagine distinte per la lista, l’edit, il dettaglio
e l’inserimento di nuovi dati.
Combined-Page Mode
• I dati vengono manipolati nella stessa pagina (Master-Dteails)
Differenti Page Modes possono essere associati a
differenti tabelle
27/03/2009
www.xedotnet.org
12
Separate-Page Mode
» Separate-Page Mode
 Utilizzo del seguente route nel Global.asax
• {table}/{action}.
 La {action} può avere
i seguenti valori:
•
•
•
•
Edit
List
Details
Insert
routes.Add(
new DynamicDataRoute("{table}/{action}.aspx")
{
Constraints = new RouteValueDictionary(
new { action = "List|Details|Edit|Insert" }),
Model = model
});
 Ogni operazione viene fatta in una pagina differente
27/03/2009
www.xedotnet.org
13
Combined Page Mode
» Combined Page Mode
 Utilizzo del seguente route nel Global.asax
• {table}/ListDetails.aspx
 La pagina ListDetails è utilizzata per manipolare i dati e per visualizzarne il
dettaglio.
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});
27/03/2009
www.xedotnet.org
14
Combinazioni di Page Modes
» Combinazioni di Page Modes
 Ogni entità/tabella può far uso di un suo specifico Page Mode
 Nel definire le regole di routing, l’ordine di inserimento è importante.
routes.Add(
new DynamicDataRoute(“Products/{action}.aspx")
{
Constraints = new RouteValueDictionary(
new { action= "List|Details|Edit|Insert" }),
Model = model,
Table= “Products” });
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});
27/03/2009
www.xedotnet.org
Non verrà eseguito in quanto
ha lo stesso routing di quello
precedente
15
Fields Template
» Fields Template
• Le pagine fanno uso dei
FieldTemplates per visualizzare ed
editare le informazioni
• I controlli vengono iniettati a runtime
• I field templates sono specializzati
per tipo di dato che devono
visualizzare
• Boolean checkbox
• Relationshipdropdownlist
• Textshow  TextBox o Literal
27/03/2009
www.xedotnet.org
16
Fields Template
» Fields Template
• Se non esiste un Field per un
specifico tipo di dato, questo non
verrà visualizzato
• {tipoDato}.ascx
• {tipoDato}_Edit.ascx
• Tramite l’attributo UHint è possibile
specificare quale Field Utilizzare
• Per sostituire il Field di default
• Per assegnare un Field per un tipo
sconosiuto
27/03/2009
www.xedotnet.org
17
Custom Pages Template
» Custom Pages Template
• Si possono creare dei nuovi template
di pagina
• Devono seguire la seguente regola
• DynamicData\CustomPages\{entity_name}\PageName.aspx
• Per associare una pagina ListDetails.aspx
alla classe Suppliers
• DynamicData\CustomPages\Suppliers\ListDetails.aspx
27/03/2009
www.xedotnet.org
18
Custom Pages Template
» Custom Pages Template
 Le pagine contengono DynamicField
• Permettono di iniettare a runtime il controllo corretto
per visualizzare/editare il dato
<Columns>
<asp:DynamicField
<asp:DynamicField
<asp:DynamicField
<asp:DynamicField
</Columns>
DataField="CompanyName" />
DataField="Phone" />
DataField="Fax" />
DataField="Products" />
 Le pagine cusomizzate devono mantenere lo stesso nome di quelle orignali
• ListDetails.aspx, Edit.aspx, List.aspx, ...
• Lo stesso URL viene utilizzato per accedere sia alle pagine customizzate,
che ai template originali
27/03/2009
www.xedotnet.org
19
Custom Field Template
» Custom Field Template
 Oltre alle pagine è possibile modificare anche i FieldTemplate, in modo da
poter editare dei tipi custom, oppure per modificare il comportamento o aspetto
di quelli
già presenti
• I nuovi FieldTemplate devono estendere la classe FieldTemplate UserControl
<asp:CalendarID="Calendar1" runat="server“
SelectedDate="<%# (FieldValue!=null)? FieldValue : DateTime.Now%>"
VisibleDate="<%# (FieldValue!=null)? FieldValue : DateTime.Now%>"
</asp:Calendar>
 Utilizzare FieldValue per recuperare il valore da visualizzare
 Utilizzare l’override di ExtractValues() per scrivere i valori nel DB
protected override void ExtractValues(IOrderedDictionary dictionary)
{
dictionary[Column.Name] = ConvertEditedValue(Calendar1.SelectedDate.ToShortDateString());
}
27/03/2009
www.xedotnet.org
20
MetaData application
» MetaData application
 I Dynamic Data utilizzano i MetaData per descrivere il Data Model.
 Tramite i MetaData possiamo andare ad aggiungere “caratteristiche” al nostro Data Model
• Si deve aggiungere i MetaData tramite una partial class
using System;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(EmployeeMetadata))]
public partial class Employee
{
}
public class EmployeeMetadata
{
[UIHint("DateTimeCalendar")]
public objectHireDate{ get; set; }
}
27/03/2009
www.xedotnet.org
21
Validazione
» Validazione
 E’ possibili specifacare alcune validazioni tramite alcuni attributi inseriti nella
classe dei MetaData
public class CustomerMetadata
•
•
[Required()]
[Range(0,100)]
{
[Required()]
public object Title;
}
 E’ possibile utilizzare gli eventi all’interno della partial class
• Pattern On<Field>Changing, On<Field>Changed
Public partial class Customer
{
partial void OnTitleChanging(string value)
{
if(!Char.IsUpper(value[0]))
throw new ValidationException("Title must start with an upper case letter.");
}
}
27/03/2009
www.xedotnet.org
22
Validazione
» Validazione
 E’ possibile utilizzare l’evento OnValidate (globale, della classe)
•
Si è in grado di filtrare la validazione anche per ChangeAction
 Le eccezzioni vengono gestite nella pagina e visualizzate in un
SummaryValidator (all’interno della pagina)
Public partial class Employee
{
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
if(action == System.Data.Linq.ChangeAction.Insert)
{
if(this._BirthDate.Value.CompareTo(DateTime.Now) > 0)
throw new ValidationException(“The birth date cannot be in the future”);
}
}
}
27/03/2009
www.xedotnet.org
23
Conclusioni
» Conclusioni
• I Dynamic Data facilitano la creazione di data-driven
website (che fanno uso di CRUD)
• Aumentano la produttività in fase di sviluppo
• Semplica la manutenzione dell’applicazione
• Ampia possibilità di customizzazione
» Aspetti negativi
• Non coprono tutte le casistiche di sviluppo, ma solo una
minima parte
• In alcune applicazioni, ci si scontra con parecchi vincoli
by design (è la prima release)
27/03/2009
www.xedotnet.org
24
Prossimi Eventi
 3 Aprile 2009
 Test Driven Development – Mauro Servienti
Novotel Venezia - Mestre
 30 Aprile 2009
 .NET Micro Framework – Mirco Vanini
Online – Live Meeting
 8 Maggio 2009
 NetTiers & code Generation – Davide Senatore
Novotel Venezia - Mestre
 5 Giugno 2009
 Programming C# 3.0 – Andrea Dottor
Novotel Venezia - Mestre
In collaborazione con
Links
Andrea Dottor
blog: blog.dottor.net
email: [email protected]
live messenger: [email protected]
community: http://www.xedotnet.org
27/03/2009
www.xedotnet.org
26
Scarica

ASP.NET Dynamic Data