Eine Webanwendung in 15 Minuten - Konzept von Dynamic Data
Themen
Datengesteuerte Architektur, Codegenerierung, ASP.NET, Internetprogrammierung, Anwendungsentwicklung. .NET Framework
Technologische Rahmen
Windows 7 Home Premium Version 6.1.7600 Build 7600, .NET Framework 4.0.30128 RC1Rel, Visual Studio 2010 Version 10.0.30128.1 RC1Rel
Einführung
Mit dem Konzept von DynamicData hat Microsoft ein Framework von ASPX-Webseiten und ASCX-Steuerelementen entwickelt. Man erstellt das Framework mit Visual Studio Projekt Vorlagen ASP.NET Dynamic Data Linq to SQL Web Application oder ASP.NET Dynamic Data Data Entities Web Application.
Welchen Nutzen hat man davon? Wenn eine Datenbank bereits vorhanden ist, kann man mit Hilfe von DynamicData in kürzester Zeit eine Web-Benutzeroberfläche erstellen. Dabei werden für jede Tabelle so genannte Display- Edit- und Insert-Webseiten erstellt. Mit anderen Wörtern erstellt man eine fertige Webanwendung in höchstens 15 Minuten. Früher waren Entwickler bei solchen Aufgaben mit vielen zeitraubenden Fragen konfrontiert. Man überlegte erst wie man Datenbankzugriff aus der Anwendung heraus realisiert. Die Palette möglicher Lösungen erfasste unter anderem direkte Datenbindung, Programmieren der Datenzugrifflogik pro Anwendungsfall, Erstellung benutzerdefinierter Datenzugriffs- bzw. Geschäftsobjekte, Verwenden eines ORM-Frameworks, etc.
Hat man sich für eine Datenbankzugriffslogik festgelegt, war es die Zeit sich mit der Web-Benutzeroberfläche zu beschäftigen. Die Aspekte, die man dabei berücksichtigen sollte erfassten Seitennavigation, einheitliches Aussehen, Sicherheit, Caching, etc. Dann müssten die Webseiten programmiert werden.
Ich erinnere mich welche Aufwand war mit diesen Aufgaben verbunden, wenn es in einem Projekt um eine Datenbank ging, die lediglich ca. 200 Tabellen umfasste. Architektonisch wurde es zu Gunsten benutzerdefinierter Datenzugriffs- bzw. Geschäftsobjekte entschieden und man verbrachte erst mal ein paar Monate mit deren Design und Implementierung. Was die Sache noch verlangsamte ist der Umstand, dass man ohne fertige bzw. halbfertige Geschäftsobjekte nicht im vollem Umfang die Webseiten programmieren konnte. Effizient kann man solche Vorgehensweise nicht bezeichnen.
DynamicData hilft an der Stelle. Genauer gesagt hilft DynamicData alleine nur den zweiten Schritt zu vereinfachen - nämlich die Erstellung der Webseiten. Wenn DynamicData aber zusammen mit Microsoft ORM-Frameworks (Linq to SQL, Entity Framework) eingesetzt wird - und dies ist standardmäßig der Fall - dann kann man in kürzester Zeit beide Aufgaben erldigen: Erstellung der Geschäftsobjekte für den Datenbankzugriff und Erstellung der Webbenutzeroberfläche dafür.
Bevor ich zu einem Beispiel übergehe, möchte ich erwähnen, dass eine mit DynamicData erstellte Anwendung wird wahrscheinlich allen Anforderungen eines anspruchsvollen Kunden nicht genügen. Man wird automatisch generierte Anwendung weiter anpassen müssen. Wo ich aber zweifellos Einsatzbereich für DynamichData sehe sind die Fälle, wo man mit einer kurzfristig erstellten funktionierten Webanwendung sofort Geschäfts- bzw. Wettbewerbsvorteile erzielen kann.
Um den Nutzen zu verdeutlichen erlaube ich mir hier ein Beispiel darzustellen. Man hat eine Datenbank mit 3 Tabellen: Kunde, Buch, Bestellung. Es geht um ein primitives Datenmodell einer Buchhandlung.
Hier können Sie die Datenbankdatei und Datenbanklogdatei herunterladen: Buchhandlung.mdf
Erstellung eines Beispielprojektes
Zwecks uns mit dem DynamicData-Konzept vertrauter zu machen, erstellen wir einen Beispielprojekt vom Typ ASP.NET DynamicData Linq to SQL Web Application. Wir benennen das Projekt DynamicDataTestCenter wie folgende Abbildung dies illustriert.
Visual Studio erstellt jetzt eine Projektmappe mit einem darin enthaltenen Projekt. Wir schauen uns die Struktur des erstellten Projektes genauer an. Dabei notieren wir das Verzeichnis DynamicData mit vielen Unterverzeichnissen. Dieses Verzeichnis nehmen wir uns genauer unter die Lupe. Bevor wir das tun, notieren wir auch das Verzeichnis Scripts und die Dateien Site.css und Site.master. Ein erfahrener ASP.NET-Entwickler schließt daraus, dass es sich dabei um AJAX-Unterstützung, CSS-Stylesheets und einheitliches Aussehen der Website mittels Masterseiten handelt. Es ist wirklich so. Mit DynamicData kann man ein mächtiges Anwendungsgerüst erstellen, das AJAX-Unterstützung und Masterseitenkonzept bietet.
Hinzufügen der DynamicData-Funktionalität zu einer vorhandenen ASP.NET Anwendung
An dieser Stelle möchte ich betonen, dass DynamicData-Funktionalität auch zu einer vorhandenen ASP.NET Anwendung hinzugefügt werden kann. Dies ist ein separates Thema an sich und muss in einem separaten Artikel behandelt werden. Hier möchte ich nur Grundprinzip erwähnen. Der bestehet darin, dass man ein neues DynamicData Projekt erstellt - analog zu dem wie wir das in vorherigem Schritt gemacht haben - und anschließend DynamicData-Elemente durch Copy & Paste zu einem vorhandenen Projekt hinzufügt. Zu diesen drei DynamicData-Elementen gehören:
- Verzeichnis DynamicData samt Unterverzeichnisse
- Datei Site.Master
- Datei Site.css
DynamicData-Vorlagen (Templates)
Bevor wir mit dem Beispiel fortschreiten, möchte ich die Unterverzeichnisse des DynamicData-Folders näher untersuchen. Man sieht die Dateien Details.aspx, Edit.aspx, Insert.aspx, List.aspx, ListDeatils.aspx. Das sind Seitenvorlagen für Anwendungsfälle Daten einer Tabelle anzeigen, Datensatz anzeigen, Datensatz editieren, Datensatz hinzufügen. Öffnen wir die Datei List.aspx können wir unter anderen folgende Steuerelemente sehen: DynamicDataManager, UpdatePanel, ValidationSummary, DynamicValidator, GridView, LinqDataSource, QueryExtender. Im Markup der Seiten Details.aspx, Edit.aspx, Insert.aspx notieren wir, das wir FormView-Steuerelement statt GridView sehen. |
![]() |
DynamicData benutzt die Seitenvorlagen um Web-Benutzeroberfläche zur Laufzeit dynamisch zu erstellen. Neben der Seitenvorlagen gibt es noch Feldvorlagen, Entitätsvorlagen und Filter. Die Feldvorlagen bestimmen das Aussehen der einzelnen Felder. Es gibt jeweils eine Feldvorlage pro Datentyp wie die Abbildung unten zeigt. Es fällt auch auf, dass Feldvorlagen als Usercontrols (ASCX-Dateien) realisiert sind.
Entitätsvorlagen sind ebenfalls Usercontrols, beziehen sich aber nicht auf einzelne Datenfelder sondern auf den gesamten zurzeit ausgewählten Datensatz. Es gibt noch Filtervorlagen. Die Filtervorlagen repräsentieren SQL-Where-Klausel, werden in Kategorien Boolean, Enumeration und ForeignKey aufgeteilt und sind auch ASCX-Dateien. Man kann durch Anpassung der Filtervorlagen die boolesche Werte, Auflistungen und Fremdschlüssel durch verschiedene Steuerelemente wie z.B. CheckBox, DropDownList, RadioButton rendern lassen.
![]() |
![]() |
![]() |
Generierung der LINQ-Klassen
Zunächst fügen wir unserem Projekt Datenbankdatei mit unserem Buchhandlung-Datenbank. Dafür klicken wir mit rechter Maustaste auf das Verzeichnis App_Data, dann Vorhandenes Element hinzufügen. Anschließen suchen wir in Dateisystem heruntergeladene Datei Buchhandlung.mdf. Anschließend fügen wir dem Projekt LINQ-to-SQL-Klassen.
Es wird ORM-Designer angezeigt. Wir klicken auf das Link Server Explorer, suchen Datenverbindung Buchhandlung.mdf, wählen alle Taebellen aus und ziehen sie auf die ORM-Designer-Oberfläche.
Jetzt speichern wir die Datei Buchhandlung.dbml, schließen sie und prüfen was von Visual Studio genau generiert wurde. Dafür öffnen wir generiete Datei Buchhandlung.designer.cs, klappen Dropdownlist links oben und sehen 5 Klassen, die generiert wurden.
Wir notieren, das es jeweils eine Klasse pro Tabelle generiert wurde und
zusätzlich eine DataContext-Klasse. Wir merken uns deren Name -
BuchhandlungDataKontext. Jetzt öffnen wir die globale
Anwendungskonfigurationsdatei Global.asax.cs und schauen uns die Methode
RegisterRoutes. In der Methode suchen wir auskommentierte Zeile
DefaultModel.RegisterContext(typeof(YourDataContextType), new
ContextConfiguration() { ScaffoldAllTables = false });
nehmen Kommentar weg, setzen den Namen unserer DataContext-Klasse -
BuchhandlungDataKontext statt YourDataContextType und ändern den Parameter ScaffoldAllTables auf
true.
Jetzt starten wir das Projekt.
Jetzt haben wir fertige Webanwendung und können in allen Tabellen unserer Buchhandlung-Datenbank die Daten ansehen, ändern, hinzufügen und löschen.
Die Sache mit Scaffolding
Es gibt unzählige Möglichkeiten die automatisch generierte Anwendung anzupassen sowie designmäßig als auch verhaltensmäßig. Ein erfahrener .NET-Entwickler wird diese Möglichkeiten nach einer Code-Analyse schnell herausfinden. Ich will am Ende dieses Artikels nur eine Anpassungsmöglichkeit erwähnen. Ich will erklären wie man es erreichen kann, dass nicht alle Tabellen einer Datenbank die dynamische Web-Benutzeroberfläche bekommen. Aber zunächst zu deutscher Übersetzung von Scaffolding.
Scaffolding wird auf deutschen Seiten oft mit Gerüstbau übersetzt. Ich vertete die Ansicht, dass man nicht die einzelne Wörter sondern Sinn übersetzen soll. Mein Vorschlag für deutsche Übersetzung von Scaffolding ist dynamische Generierung von Webseiten.
Wenn nicht alle Tabelle der Datenbank automatisch generierte Webseiten bekommen sollen, setzt man Parameter ScaffoldAllTables in globaler Anwendungskonfigurationsdatei auf false. Anschließend erstellt man partielle Klassen für jede LINQ-to-SQL-Klasse und versieht sie mit Annotation [ScaffoldTable(true)] Analog kann man die Felder steuern mit der Annotation [ScaffoldColumn(true)]