Il presente articolo è stato tradotto automaticamente.
ASP.NET Dynamic Data
Creare un sito Web aziendale basato su dati in 5 minuti
James e. Henry
Per anni, gli sviluppatori hanno wrestled con le attività di creazione di livelli di dati con funzionalità di creazione, lettura, aggiornamento ed eliminazione (CRUD) devono essere utilizzate dall'interfaccia utente noiose. È possibile ricordare personalmente un progetto da oltre 10 anni necessari per scrivere codice generato automaticamente aziendali e livelli di dati da un modello di oggetto Rational rosa. Era molto lavoro.
Pochi anni successivi Microsoft ha introdotto Microsoft .NET Framework e l'oggetto DataSet. Con Progettazione DataSet è possibile connettere un DataSet tipizzato a un database back-end, ad esempio SQL Server e quindi lavorare con il DataSet in tutta l'applicazione. Questo ridurre al minimo la necessità di lavorare direttamente con SQL, ma ancora necessaria la creazione manuale delle pagine Web per visualizzare dati dal database.
Avanzamento rapido più anni e Microsoft ha introdotto Entity Framework. Questo framework ORM (Object Relational Mapping) utilizza LINQ per astrarre uno schema di database e presenta un'applicazione come uno schema concettuale. Come DataSet, questa tecnologia ridotto anche la necessità di intervenire direttamente da SQL. Tuttavia, ancora necessaria la creazione manuale delle pagine Web per visualizzare dati.
Ora Microsoft ha introdotto ASP.NET Dynamic Data, ovvero una combinazione di Entity Framework e distribuzione di ASP.NET, che consente a un'applicazione di rispondere agli URL non sono fisicamente presenti. Con queste funzionalità è possibile creare un sito Web pronto per la produzione, basate sui dati in pochi minuti. In questo articolo viene illustrato come.
Guida introduttiva
Per impostare lo scenario, pronunciare let’s che sto creazione di un sito Web intranet per una società fittizia denominata Adventure Works. Questo sito consente all'azienda di gestire le informazioni sui dipendenti.
L'azienda vengono memorizzati in un database di Microsoft SQL Server 2008. (Può scaricare e installare il database dal msftdbprodsamples.codeplex.com .)
Aprire Microsoft Visual Studio 2010 e creare un nuovo progetto ASP.NET Dynamic Data entità sito Web C#.
Il tipo di progetto di sito Web ASP.NET Dynamic Data entità si avvale di ASP.NET routing ed Entity Framework consentono di creare rapidamente siti Web basati su dati. Per ottenere questa funzionalità, è necessario aggiungere al progetto un modello di dati Entity Framework. A tale scopo, scegliere Aggiungi nuovo elemento dal menu sito Web. Nella finestra di dialogo Aggiungi nuovo elemento selezionare ADO.NET Entity Data Model. Nome HumanResources.edmx.
In Visual Studio richiederà quindi aggiungere il modello nella cartella App_Code. Scegliere Sì e consentire di apportare questa modifica. Quando si creano progetti di sito Web, Visual Studio compila dinamicamente tutto il codice viene inserito nella cartella App_Code. Nel caso di Entity Data Model, Visual Studio genera automaticamente una classe parziale per il contesto dei dati e classi parziali per le entità. In questo esempio inserito il codice in un file denominato HumanResources.Designer.cs.
Successivamente, verrà visualizzata guidata Entity Data Model, come illustrato in di Figura 1. Scegliere Genera da database e fare clic su Avanti.
Figura 1 iniziale di creazione guidata del modello Entity Data
Scegliere una connessione al database AdventureWorks. Se non esiste una connessione, è necessario crearne uno nuovo. Figura 2 indica una connessione su AdventureWorks su un'istanza di SQL Server denominata Dev\BlueVision.
Figura 2 Configuring Data Connection
Nella pagina successiva è possibile tutte le tabelle nello schema di risorse umane. Il nome dello schema viene visualizzato tra parentesi. Figura 3 vengono illustrate alcune delle tabelle selezionate.
Figura 3 Selezione tabelle per lo schema di risorse umane in Visual Studio
Quando si sceglie Fine, Visual Studio genera automaticamente le entità dalle tabelle scelto per il progetto. Figura 4 illustra sette entità verrà generato dallo schema di database. In Visual Studio utilizzati i vincoli di chiave esterni nel database per creare le relazioni tra le entità. Ad esempio, l'entità Employee fa parte di una relazione uno-a-molti con l'entità JobCandidate. Ciò significa che un dipendente può essere un candidato per più processi all'interno della società.
Figura 4 entità generati dalle tabelle di database in Visual Studio
Si noti inoltre che l'entità EmployeeDepartmentHistory unisce le entità Employee e reparto. Aveva nella tabella EmployeeDepartmentHistory contiene solo i campi che erano necessari per unire le tabelle Employee e Department, Visual Studio sarebbe stato semplicemente omesso entità EmployeeDepartmentHistory. Questo avrebbe consentito lo spostamento diretto tra l'entità Employee e reparto.
Utilizzando la distribuzione ASP.NET
Routing ASP.NET consente a un'applicazione di rispondere agli URL non sono fisicamente presenti. Ad esempio, due URL, http: / / sitopersonale/dipendente e http://mysite/Department—could essere diretto a una pagina alla http://mysite/Template.aspx. La pagina stessa potrebbe quindi estrarre informazioni dall'URL per determinare se visualizzare un elenco di dipendenti o un elenco dei reparti, con entrambe le visualizzazioni utilizzando lo stesso modello di visualizzazione.
Una route è semplicemente un modello di URL mappato a un gestore ASP.NET HTTP. È compito del gestore per determinare come l'URL effettivo associato al modello interpretato. ASP.NET Dynamic Data utilizza un gestore di route denominato DynamicDataRouteHandler interpreta segnaposto denominati {tabella} e {azione} schemi URL. Ad esempio, un gestore potrebbe utilizzare questo modello di URL:
http://mysite/{table}/{action}.aspx
Motivo può quindi essere utilizzata per interpretare http://mysite/Employee/List.aspx URL.
Dipendente viene elaborato come il segnaposto {tabella} ed elenco viene elaborato come il segnaposto {azione}. Il gestore può quindi visualizzare un elenco di istanze di entità Employee. DynamicDataRouteHandler il segnaposto {tabella} viene utilizzata per determinare il nome dell'entità da visualizzare e utilizza il parametro {action} per determinare il modello utilizzato per visualizzare l'entità.
Il file Global.asax contiene un metodo statico denominato RegisterRoutes viene chiamato al primo avvio dell'applicazione, come illustrato di seguito:
public static void RegisterRoutes(RouteCollection routes) {
// DefaultModel.RegisterContext(typeof(YourDataContextType),
// new ContextConfiguration() { ScaffoldAllTables = false });
routes.Add(new DynamicDataRoute("{table}/{action}.aspx") {
Constraints = new RouteValueDictionary(
new { action = "List|Details|Edit|Insert" }),
Model = DefaultModel
});
}
La prima operazione da effettuare è rimuovere il commento dal codice che chiama il metodo RegisterContext dell'istanza DefaultModel. Questo metodo registra il contesto di dati Entity Framework ASP.NET Dynamic Data. È necessario modificare la seguente riga di codice:
DefaultModel.RegisterContext(
typeof(AdventureWorksModel.AdventureWorksEntities),
new ContextConfiguration() { ScaffoldAllTables = true });
Il primo parametro specifica il tipo di contesto di dati, in questo esempio è AdventureWorksEntities. Impostando la proprietà ScaffoldAllTables su true, è possibile consentire tutte le entità da visualizzare nel sito. Questa proprietà è impostata su false, sarà necessario applicare l'attributo ScaffoldTable(true) per ogni entità devono essere visualizzati nel sito. (In pratica, occorre impostare la proprietà ScaffoldAllTables su false per impedire agli utenti finali l'esposizione accidentale dell'intero database.)
Il metodo Add della classe RouteCollection aggiunge una nuova istanza di route nella tabella di route. Con ASP.NET Dynamic Data, l'istanza di route è effettivamente un'istanza DynamicDataRoute. La classe DynamicDataRoute utilizza internamente DynamicDataRouteHandler come gestore. Il parametro passato al costruttore di DynamicDataRoute rappresenta il motivo che è necessario utilizzare il gestore per elaborare URL fisico. Viene inoltre impostato un vincolo per limitare i valori {azione} all'elenco, dettagli, modifica o inserimento.
In teoria è necessario utilizzare ASP.NET Dynamic Data. Se generare ed eseguire l'applicazione, verrà visualizzata la pagina visualizzata in di Figura 5.
Figura 5 di un sito di dati dinamico ASP.NET base
Supporto di metadati
Una cosa da notare è che sono identici per i nomi delle tabelle che rappresentano i nomi di entità. Nel codice e nel database può essere corretta, tuttavia, in genere ciò non avviene nell'interfaccia utente.
ASP.NET Dynamic Data makes it easy to change the name of a displayed entity by applying the DisplayName attribute to the class that represents that entity. Perché le classi di entità sono contenute in un file che viene rigenerato automaticamente da Visual Studio, si devono apportare le modifiche di codice per classi parziali in un file di codice separato. Pertanto, è possibile aggiungere un nuovo file di codice denominato Metadata.cs nella cartella App_Code. Aggiungere quindi il seguente codice al file:
using System;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace AdventureWorksModel {
[DisplayName("Employee Addresses")]
public partial class EmployeeAddress { }
}
Quindi ricreare ed eseguire l'applicazione. Si noterà che EmployeeAddresses è ora impiegato indirizzi.
Analogamente, è possibile modificare i nomi dei EmployeeDepartmentHistories, EmployeePayHistories e JobCandidates a nomi più appropriati.
Quindi fare clic sul collegamento cambiamenti. Consente di visualizzare un elenco dei turni del dipendente. Potrà modificare i nomi StartTime ed EndTime Ora inizio e ora fine, rispettivamente.
Un altro problema è che i valori di ora di inizio e ora fine mostrano la data e l'ora. In questo contesto, l'utente deve solo visualizzare l'ora in questo modo formatterà ora inizio e ora fine valori in modo da visualizzare solo l'ora. Un attributo denominato DataType consente di specificare un tipo di dati più specifico per un campo, ad esempio EmailAddress o ora. È possibile applicare l'attributo del tipo di dati al campo a cui si applica.
Innanzitutto, aprire il file Metadata.cs e aggiungere le seguenti definizioni di classe:
[MetadataType(typeof(ShiftMetadata))]
public partial class Shift { }
public partial class ShiftMetadata { }
Si noti che un attributo denominato MetadataType viene applicato alla classe tenendo premuto MAIUSC. Questo attributo consente di designare una classe separata che contiene metadati aggiuntivi per i campi dell'entità. Non è possibile applicare ulteriori metadati direttamente ai membri della classe Shift perché non è possibile aggiungere gli stessi membri di classe per più di una classe parziale. Ad esempio, la classe Shift definita in HumanResources.Designer.cs già dispone di un campo denominato StartTime. Pertanto non è possibile aggiungere lo stesso campo nella classe Shift definiti in Metadata.cs. Inoltre, non devono modificare manualmente HumanResources.Designer.cs poiché tale file ottiene rigenerato da Visual Studio.
L'attributo MetadataType consente di specificare una classe completamente diversa in modo da poter applicare i metadati per un campo. Aggiungere il seguente codice alla classe ShiftMetadata:
[DataType(DataType.Time)]
[Display(Name = "Start Time")]
public DateTime StartTime { get; set; }
L'attributo DataType specifica il valore enumerato ora per indicare che il campo StartTime deve essere formattato come un valore di ora. Altri valori enumerati sono PhoneNumber, password, valuta ed EmailAddress, per citarne alcuni. L'attributo Display specifica il testo da visualizzare come colonna del campo quando il campo viene visualizzato in un elenco, come etichetta del campo quando viene visualizzato in modalità di sola lettura o modifica.
Ora rigenerare ed eseguire l'applicazione. Figura 6 viene illustrato il risultato di fare clic sul collegamento cambiamenti.
Figura 6 aggiornamento pagina cambiamenti tramite definizioni MetadataType
È possibile aggiungere codice simile per modificare l'aspetto del campo EndTime.
Ora let’s dare un'occhiata al collegamento JobCandidates. La colonna Employee Visualizza valori contenuti nel campo NationalIDNumber. Questo potrebbe non essere utile. La tabella Employee del database non è disponibile un campo per il nome del dipendente, tuttavia presenta un campo per l'accesso di un dipendente, ovvero LoginID. Questo campo può fornire informazioni utili a un utente del sito.
A tale scopo, verrà nuovamente modificare il codice di metadati in modo che tutte le colonne Employee visualizzano il valore del campo LoginID. Aprire il file Metadata.cs e aggiungere la seguente definizione di classe:
[DisplayColumn("LoginID")]
public partial class Employee { }
L'attributo DisplayColumn specifica il nome del campo da un'entità che deve essere utilizzato per rappresentare istanze di entità. Figura 7 Mostra il nuovo elenco con LoginIDs.
Figura 7 Identificazione dei dipendenti con LoginIDs
Intestazione laterale: Modifiche di attributo in .NET Framework 4
A partire da Microsoft .NET Framework 4, si consiglia di utilizzare l'attributo Display anziché l'attributo DisplayName di .NET Framework 3.5. DisplayName è ovviamente ancora nel framework, è consigliabile contro, ogni volta che è possibile utilizzare l'attributo Display.
Esistono due motivi per preferenza schermo anziché DisplayName. In primo luogo, l'attributo Display supporta la localizzazione mentre l'attributo DisplayName non esiste.
In secondo luogo, l'attributo Display consente di controllare tutti i tipi di elementi. Ad esempio, è possibile controllare il testo per i vari modi in cui un campo può essere visualizzato (prompt intestazione, quindi su), se un campo visualizzato come un filtro o se il campo viene visualizzato nella finestra della struttura (AutoGenerate = false lo disattiva).
Quindi, mentre il codice mostrato negli esempi riportati in questo articolo è completamente valido, si consiglia di sostituire DisplayName e ScaffoldColumn con l'attributo Display. È comunque necessario utilizzare ScaffoldTable e l'attributo DisplayName a livello di classe.
Seguendo questi consigli è preferibile perché altri team Microsoft supporta lo spazio dei nomi DataAnnotations (servizi WCF RIA) e seguendo queste procedure verrà assicurarsi che codice funziona con essi.
Il campo IDContatto dell'entità Employee effettivamente fa riferimento a una riga nella tabella contatto, che fa parte dello schema Person nel database. Dal momento che non sono state aggiunte tabelle dallo schema Person, Visual Studio consente la modifica diretta del campo IDContatto. Per applicare l'integrità relazionale, verrà impedire la modifica di questo campo consentendo comunque essere visualizzati per riferimento. Aprire il file Metadata.cs e modificare la classe Employee applicando l'attributo MetadataType seguente:
[DisplayColumn("LoginID")]
[MetadataType(typeof(EmployeeMetadata))]
public partial class Employee { }
Definire quindi la classe EmployeeMetadata come segue:
public partial class EmployeeMetadata {
[Editable(false)]
public int ContactID { get; set; }
}
L'attributo modificabile specifica se un campo è modificabile nell'interfaccia utente.
Successivamente, aggiungerò metadati entità EmployeePayHistory per visualizzare nel campo Tariffa tariffa oraria, nonché di formattare il valore del campo Valuta. Aggiungere le seguenti definizioni di classe nel file Metadata.cs:
[MetadataType(typeof(EmployeePayHistoryMetadata))]
public partial class EmployeePayHistory { }
public partial class EmployeePayHistoryMetadata {
[DisplayFormat(DataFormatString="{0:c}")]
[Display(Name = "Hourly Rate")]
public decimal Rate { get; set; }
}
Personalizzazione di modelli
Il progetto di Visual Studio contiene una cartella denominata FieldTemplates. Questa cartella contiene i controlli utente per i campi di modifica dei tipi di dati diversi. Per impostazione predefinita, ASP.NET Dynamic Data associa un campo a un controllo utente che ha lo stesso nome nel campo del associati tipi di dati. Ad esempio, il controllo utente Boolean.ascx contiene l'interfaccia utente per la visualizzazione di campi booleani, mentre il controllo utente Boolean_Edit.ascx contiene l'interfaccia utente per la modifica dei campi di tipo Boolean.
In alternativa, è possibile applicare l'attributo UIHint a un campo per assicurarsi che venga utilizzato un controllo utente diverso. Aggiungerò un modello personalizzato per un controllo calendario per la modifica del campo Data di nascita dell'entità Employee.
In Visual Studio, aggiungere un nuovo elemento di campo dati dinamici al progetto e denominarlo Date.ascx. In Visual Studio aggiunge automaticamente un altro file denominato Date_Edit.ascx nella cartella FieldTemplates. Innanzitutto verrà sostituire il contenuto della pagina Date_Edit.ascx con il seguente codice:
<asp:Calendar ID="DateCalendar" runat="server"></asp:Calendar>
Quindi verrà modificato il file Date_Edit.ascx.cs con la definizione di classe completa illustrata in di Figura 8.
Figura 8 di classe Date_EditField personalizzata
public partial class Date_EditField : System.Web.DynamicData.FieldTemplateUserControl {
protected void Page_Load(object sender, EventArgs e) {
DateCalendar.ToolTip = Column.Description;
}
protected override void OnDataBinding(EventArgs e) {
base.OnDataBinding(e);
if (Mode == DataBoundControlMode.Edit &&
FieldValue != null) {
DateTime date = DateTime.MinValue;
DateTime.TryParse(FieldValue.ToString(), out date);
DateCalendar.SelectedDate =
DateCalendar.VisibleDate = date;
}
}
protected override void ExtractValues(
IOrderedDictionary dictionary) {
dictionary[Column.Name] = ConvertEditedValue(
DateCalendar.SelectedDate.ToShortDateString());
}
public override Control DataControl {
get {
return DateCalendar;
}
}
}
È possibile ignorare il metodo OnDataBinding per impostare la proprietà SelectedDate e VisibleDate del controllo Calendar per il valore del campo FieldValue. Campo FieldValue è ereditato da FieldTemplateUserControl e rappresenta il valore del campo dati da visualizzare. È possibile anche modificare il metodo ExtractValues sottoposto a override per salvare le modifiche alla proprietà SelectedDate per un dizionario delle coppie nome / valore. Per aggiornare l'origine dati sottostante ASP.NET Dynamic Data utilizza i valori nel dizionario.
Successivamente, è necessario informare ASP.NET Dynamic Data utilizzare modelli di campo Date.ascx e Date_Edit.ascx per il campo Data di nascita. È possibile farlo in due modi. Innanzitutto, applicare l'attributo UIHint come segue:
[UIHint("Date")]
public DateTime BirthDate { get; set; }
In alternativa, applicare l'attributo DateType come segue:
[DataType(DataType.Date)]
public DateTime BirthDate { get; set; }
L'attributo DataType fornisce mapping automatico corrispondente al nome del tipo di dati per il nome del controllo utente. L'attributo UIHint offre maggiore controllo nelle situazioni in cui il campo tipo non corrisponde al nome del controllo utente. Figura 9 viene illustrato il risultato della modifica di un dipendente.
Figura 9 Employee personalizzato modifica modulo
Se si modifica la data di nascita del dipendente selezionato, fare clic su Aggiorna i nuovi dati verranno salvati nel database.
La cartella PageTemplates contiene i modelli di pagina il rendering di visualizzazione appropriate per le entità. Per impostazione predefinita, sono supportati cinque modelli di pagina: List.aspx Edit.aspx, Details.aspx, Insert.aspx e ListDetails.aspx. Il modello di pagina List.aspx esegue il rendering di un'interfaccia utente per la visualizzazione di entità come dati tabulari. Il modello di pagina Details.aspx esegue il rendering di una visualizzazione di sola lettura di un'entità, mentre il modello Edit.aspx Visualizza una visualizzazione modificabile di un'entità. Pagina Insert.aspx esegue il rendering una visualizzazione modificabile con valori di campo. Il modello di pagina ListDetails.aspx consente di visualizzare un elenco di entità, nonché i dettagli per l'entità selezionata in una singola pagina.
Come accennato in precedenza nell'articolo, ASP.NET Dynamic Data indirizza automaticamente richieste di URL alla pagina appropriata esaminando il valore del parametro {action} definito per la route. Ad esempio, se ASP.NET Dynamic Data restituisce un parametro {action} come elenco, utilizza il modello di pagina List.aspx per visualizzare un elenco di entità. È possibile modificare i modelli di pagina esistente o aggiungere una nuova cartella. Se si aggiunge una nuova, è necessario aggiungerlo alla tabella di route nel file Global.asax.
La cartella EntityTemplates contiene modelli per visualizzare istanze di entità in sola lettura, modificare e inserire le modalità. Per impostazione predefinita, questa cartella contiene tre modelli denominati Default.ascx, Default_Edit.ascx e Default_Insert.ascx, quale visualizzare istanze di entità in sola lettura, modificare e inserire modalità, rispettivamente. Per creare un modello da applicare a una specifica entità, aggiungere un nuovo controllo utente per la cartella e assegnarvi il nome di set entità. Ad esempio, se si aggiunge un nuovo controllo utente denominato shifts.ascx nella cartella, questo controllo utente ASP.NET Dynamic Data utilizza per eseguire il rendering per un'entità Shift (set di entità cambiamenti) la modalità di sola lettura. Analogamente, Shifts_Edit.ascx e Shifts_Insert.ascx il rendering della modifica e inserire le modalità dell'entità Shift, rispettivamente.
Per ogni elenco di entità ASP.NET Dynamic Data utilizza campi della chiave esterna dell'entità, campi booleani e i campi dell'enumerazione per creare un elenco di filtri. I filtri vengono aggiunti come controlli DropDown nella pagina di riepilogo, come mostrato in di Figura 10.
Figura 10 includono filtri dati nella pagina
Per i filtri booleani, il controllo DropDownList semplicemente contiene tre valori: Tutti, true e false. Per i filtri di enumerazione, il controllo DropDownList contiene tutti i valori enumerati. Per i filtri di chiavi esterni, il controllo DropDownList contiene tutti i diversi valori di chiave esterna. I filtri sono definiti come controlli utente nella cartella filtri. Per impostazione predefinita, solo tre controlli utente esistono: Boolean.ascx Enumeration.ascx e ForeignKey.ascx.
Spedire IT!
Anche se si tratta di uno scenario fittizio, si è visto che è possibile creare un sito personale operativo in pochi minuti. Quindi sviluppato per migliorare l'interfaccia utente mediante l'aggiunta di metadati e un modello personalizzato.
ASP.NET Dynamic Data fornisce funzionalità di uscita della finestra che consente di ottenere un sito di backup ed eseguire rapidamente. Tuttavia, è completamente personalizzabile, che consente di soddisfare le esigenze dei singoli sviluppatori e organizzazioni. Supporto dati dinamica di ASP.NET per la distribuzione di ASP.NET consente di riutilizzare i modelli di pagina per le operazioni CRUD. Se aver acquisito sempre con dover eseguire continuamente le attività noiose dell'implementazione CRUD pagine su ogni progetto di applicazione Web, ASP.NET Dynamic Data deve creare la vita molto più semplice.
James Henry è uno sviluppatore di software indipendenti per BlueVision LLC, una società specializzata nella tecnologia Microsoft di consulenza. È l'autore di “ sviluppo Business Intelligence Solutions Using Information Bridge e Visual Studio .NET ” (Vision blu, 2005) e “ sviluppo .NET Custom Controls e Designer con C# ” (Vision blu, 2003). Possibile contattarlo all'indirizzo msdnmag@bluevisionsoftware.com .
Grazie all'esperto di tecnica seguente per la revisione di questo articolo: Scott Hunter