Vorwort
Für wen dieses Buch gedacht ist
Zielsetzung des Buchs
Unterschiede zur ersten Auflage
Typografische Konventionen
Behandelte Versionen
Express-Editionen
Verwendete Programmiersprache
Sprachversion
Leserservice
Danksagungen
Über www.IT-Visions.de
Über den Autor Manfred Steyer
Über den Autor Dr. Holger Schwichtenberg
1. ASP.NET MVC
Architektur
Model-View-Controller (MVC)
Überblick über MVVM (Model-View-ViewModel)
Erste Schritte mit ASP.NET MVC
ASP.NET MVC-Projekt anlegen
Modell anlegen
Controller anlegen
View anlegen
Webanwendung testen
Einträge editieren
Vorschlagswerte über Dropdown-Listenfelder anbieten
Controller
Models entgegennehmen
View auswählen
Auf Ausnahmen reagieren
URL-Mapping beeinflussen (Routing)
Asynchrone Controller
Vereinfachte Implementierung asynchroner Controller ab .NET 4.5
Views
Razor
Razor-Helper
Layoutseiten
Partielle Views
Vorlagen für Felder und Models
Views für mobile Anwendungen
Zwischen unterschiedlichen Ansichten wechseln
Minification und Bundling
Models
Metadaten im Model festlegen
HTML-Text übermitteln
Validieren von Benutzereingaben
Manuelles Validieren
Deklaratives Validieren
Validierungsattribute
Validierungsattribute in Metadatenklassen auslagern
Benutzerdefinierte Validierungsattribute
Serverseitige deklarative Validierung
Clientseitige Validierung
Remotevalidierung
Validieren unterbinden
Globalisierung
Sprach- und Ländereinstellungen festlegen
Über Ressourcedateien mehrsprachige Inhalte bereitstellen
Codierung festlegen
Areas
Filter
Überblick
Umsetzung
Filter auf Controller und Action-Methoden anwenden
Globale Filter
Authentifizierungsfilter
2. ASP.NET Web API
REST, WebAPIs und HTTP-Services
Einen einfachen HTTP-Service erstellen
Parameter und Rückgabewerte
HTTP-Services konfigurieren
HTTP-Services mit Fiddler testen
Mehr Kontrolle über HTTP-Nachrichten
Antworten mit HttpResponseMessage beeinflussen
Anfragen als HttpRequestMessage darstellen
HttpRequestMessage und HttpResponseMessage am Beispiel Conditional Get
Antworten über IHttpActionResult zurückgeben
HTTP-Services über HttpClient konsumieren
Routen
Benutzerdefinierte Routen über die Konfiguration festlegen
Attributbasiertes Routing
Weiterführende Schritte mit der Web-API
Dynamische Parameter
Tracing
Request Batching
Cross Origin Resource Sharing (CORS)
Validieren
Querschnittsfunktionen implementieren
Message-Handler
Einen Handler umsetzen
Handler mit HttpClient verwenden
Filter
Überblick
Filter umsetzen
Filter als Attribute einsetzen
Filter über FilterProvider bereitstellen
Filter als globale Filter registrieren
Interfaces für Filter
Authentifizierungsfilter
Filterüberschreibungen
Benutzerdefinierte Formate unterstützen
Formatter implementieren
Formatter mit HttpClient verwenden
Serialisierung beeinflussen
JSON-Serializer konfigurieren
XML-Serializer konfigurieren
Eigenschaften von der Serialisierung ausschließen
Zirkuläre Referenzen serialisieren
Binary JSON (BSON)
Web-API und HTML-Formulare
Einfache Formularfelder übermitteln
Dateiupload via HTML-Formular
Fortschritt ermitteln
Feingranulare Konfiguration
Controllerbasierte Konfiguration
Routenbasierte Konfiguration
3. JavaScript-Frameworks
JavaScript als Multiparadigmen-Sprache
Die prozedurale Seite von JavaScript
Die funktionale Seite von JavaScript
Die objektorientierte Seite von JavaScript
Objekte mit JSON beschreiben
Konstruktorfunktionen
Objekte als Dictionaries
Vererbung
Elemente mit Namespaces organisieren
Ausgewählte vordefinierte Objekte
JSON-basierte Strings
Ausnahmen
Die modulare Seite von JavaScript
JavaScript debuggen
jQuery
Wrapper-Objekte
Selektion von Seitenelementen
Ereignisbehandlung mit jQuery
Modifizieren von Seitenelementen
Animationen
AJAX
ASP.NET MVC-Modelle mit jQuery Validate validieren
jQuery UI
jQuery Mobile
Logische Seiten
Dialogfelder
Navigationsleisten
Formularfelder
Listen
Twitter Bootstrap
Bewertung von Bootstrap
Von Bootstrap unterstützte Browser
Bootstrap-Dateien
Aufbau einer Bootstrap-basierten Webseite
Bootstrap-Grundlayout
Testseite für Bootstrap-Grundlayout
Verschachtelung
Ausblenden von Inhalten
Navigation
Formulare
Symbole
Sprechblasen
Abgerundete Grafiken
Weitere Möglichkeiten
Offlinefähige Webanwendungen mit HTML 5
Daten im Web Storage speichern
Datenbanken im Browser
IndexedDB
Mit IndexedDB arbeiten
Objekte mit IndexedDB speichern
Objekte mit IndexedDB laden
Repository einsetzen
Daten über Index abrufen
IndexedDB nachrüsten
Werkzeuge für IndexedDB
Anwendungsdateien im Browser speichern
Aufbau eines Cache-Manifests
Cache-Manifest dynamisch erzeugen
Cache-Manifest über JavaScript aktualisieren
Asynchronität und Hintergrundprozesse
Mit Promises asynchrone Aufrufe wartbar gestalten
Mit Web-Workern Aufgaben in den Hintergrund auslagern
Internationalisierung mit Globalize
modernizr
TypeScript
Typen und Variablen
Funktionen
Klassen
Strukturelles Sub-Typing
Generics
Module
Ambiente Deklarationen
4. AngularJS
AngularJS herunterladen und einbinden
MVC, MVP und MVVM mit AngularJS
Erste Schritte mit AngularJS
Definition eines Moduls und Controllers
Deklaration der View-Models
Datenbindung verwenden
AngularJS näher betrachtet
Direktiven
Datenbindung
Scopes
Dependency-Injection
HTTP-Services via AngularJS konsumieren
Angular-Services bereitstellen und konsumieren
Filter in AngularJS
Filter verwenden
Benutzerdefinierte Filter bereitstellen
Mit Formularen arbeiten
Objekte an Formularfelder binden
Form-Controller
Eingaben validieren
Fehlerhafte Eingaben mit CSS hervorheben
Auf Validierungsergebnisse programmatisch zugreifen
Benutzerdefinierte Validierungslogiken
Steuerelementbibliotheken für AngularJS
Logische Seiten und Routing
Logische Seiten mit ng-switch
Routing mit dem Modul ngRoute
Routing mit dem externen Modul UI-Router
Verschachtelte Views
Mehrere Views pro Vorlage verwenden
Parameter übergeben
Auf Zustände programmatisch zugreifen
AngularJS-Anwendungen testen
Anatomie eines Jasmine-Tests
Der Jasmine-Test-Runner
Ein View-Model testen
Asynchrone Tests
Controller testen
HTTP-Zugriffe für Tests mit angular-mock.js simulieren
Angular-Services für Tests simulieren
Filter testen
Direktiven testen
Benutzerdefinierte Direktiven
Eine erste (zu) einfache Direktive
Eigener Scope für Direktive
Isolierte Scopes
Link-Phase
Compile-Phase
Kommunikation zwischen Direktiven
5. ASP.NET SignalR
Long-Polling
Web-Sockets
Überblick über ASP.NET SignalR
PersistentConnection
Erste Schritte mit SignalR und PersistentConnection
Lifecycle-Methoden
URL-Mapping für persistente Verbindungen
Einfacher Client für eine persistente Verbindung
Einfacher JavaScript-Client für eine persistente Verbindung
Hubs
Methoden und Callbacks mit SignalR und Hubs
URL-Mapping für Hubs
Lifecycle-Methoden
Hubs konsumieren
Hubs über JavaScript konsumieren
Gruppen
Pipeline-Module für Querschnittsfunktionen
SignalR konfigurieren
Cross Origin Resource Sharing (CORS)
SignalR skalieren
Überlegungen zum Skalieren von SignalR
SignalR mit SQL Server skalieren
Implementierung eines SignalR-Clients
Das Skalierungsszenario testen
Azure Service Bus und Redis als Alternative zu SQL Server
6. Datenzugriff mit Entity Framework
Überblick
Mit dem Entity Data Model arbeiten
Entity Data Model anlegen
Entity Data Model aus bestehender Datenbank ableiten
Entity Data Model einsehen und bearbeiten
Entity Data Model nach Datenbankänderungen aktualisieren
Datenbank für Database First generieren
Daten abfragen
Auf Entitäten zugreifen
Ergebnismenge einschränken und sortieren
Ladestrategien
Vorzeitiges Laden – Eager Loading
Lazy Loading
Benachbarte Objekte nicht laden
Mit Entity SQL auf Datenbanken zugreifen
Tracing
Entitäten verwalten
Entitäten einfügen
Entitäten aktualisieren
Getrennte Objektgraphen aktualisieren
Entitäten löschen
Konflikte erkennen und auflösen
Optimistische Konflikterkennung
Konflikte bei optimistischer Konflikterkennung auflösen
Pessimistische Konflikterkennung
Mit Transaktionen arbeiten
Transactionen mit TransactionScope
Transaktionen über DbContext steuern
Erweiterte Mapping-Szenarien
Komplexe Typen
Enumerationen
Vererbung
Polymorphe Abfragen
Table per Hierarchy (TPH)
Table per Type (TPT)
Type per concrete Type (TPC)
Tabellen zu einer Klasse zusammenfassen
Klasse auf ausgewählte Datensätze einer Tabelle abbilden
Tabelle auf mehrere Klassen verteilen
Mit gespeicherten Prozeduren arbeiten
Gespeicherte Prozeduren zum Erzeugen, Aktualisieren und Löschen verwenden
Vollständige Parallelität mit gespeicherten Prozeduren
Mit gespeicherten Prozeduren Daten abrufen
Mit nativem SQL arbeiten
Codegenerierung anpassen
Code First
Erste Schritte mit Code Only
Standardkonventionen
Konventionen mit Fluent-API überschreiben
Konventionen mit Attributen übersteuern
Benutzerdefinierte Konventionen bei Code First
Konfigurationskonventionen (Configuration Conventions)
Modellbasierte Konventionen
Code First und Stored Procedures
Konventionen für das Abbilden von Entitäten auf Stored Procedures
Vollständige Parallelität beim Einsatz von Stored Procedures unter Code First
Aus Konventionen ausbrechen
Automatisches Migrieren von Datenbanken
Datenbasierte Dienste mit dem Entity Framework, ASP.NET Web API und OData
Daten mit OData flexibel abfragen
Mögliche OData-Abfragen einschränken
OData-Abfragen global aktivieren
OData-Abfragen manuell auswerten
Daten mit OData verwalten
Batching
7. Basisdienste im ASP.NET-Umfeld
Open Web Interface for .NET (OWIN) und Katana
Ideen hinter OWIN
Katana
Self-Hosting mit Katana
Erste Schritte mit Self-Hosting
Self-Hosting von ASP.NET Web API
Self-Hosting von ASP.NET SignalR
Leichtgewichtiger Webserver für das Self-Hosting
Eigene Middleware-Komponenten implementieren
Eigene Middleware-Komponenten in Form von Klassen bereitstellen
Eigene Middleware-Komponenten in Form von Delegaten bereitstellen
Direkt mit HTTP interagieren
HttpContext
Server (HttpServerUtility)
Request (HttpRequest)
Response (HttpResponse)
Zustandsverwaltung auf Sitzungsebene
Überblick
Weitere Optionen
Programmieren mit dem Sitzungszustand
URL-basierte Sitzungsverwaltung ohne Cookies
Konfiguration des Sitzungszustands
Speicherort der Sitzungstabelle wählen
Komprimierung des Sitzungszustands
Deaktivieren des Sitzungszustands
Caching
Überblick
Pro und Contra Zwischenspeicherung
Zwischenspeicherung ganzer Seiten (Output-Caching)
Zwischenspeicherungsprofile (Caching Profiles)
Caching von Seitenteilen (Fragmentzwischenspeicherung)
Programmatisches Caching
Cacheinvalidierung
Cacheinvalidierung durch die Datenbank
Cache Invalidation bei Microsoft SQL Server 7.0 und 2000
Beispiel auf Ebene von Action-Methoden:
Beispiel für die programmatische Anwendung:
Cacheinvalidierung bei Microsoft SQL Server ab Version 2005
8. Sicherheit
Gesicherte Übertragung mit SSL/TLS
SSL für ein Webprojekt in IIS konfigurieren
Digitale Zertifikate für Entwicklung ausstellen
SSL für Self-Hosting-Szenarien konfigurieren
SSL und Clients
Zugang zu Action-Methoden beschränken
Windows-Sicherheit unter Verwendung von HTTP-basierter Authentifizierung
HTTP-Sicherheit in IIS konfigurieren
HTTP-Sicherheit in ASP.NET konfigurieren
Windows-Sicherheit bei Self-Hosting
Windows-Sicherheit mit HttpClient
Mit Clientzertifikaten arbeiten
IIS konfigurieren
In Service auf Clientzertifikat zugreifen
Client für Authentifizierung mittels Clientzertifikat vorbereiten
Sicherheitszenarien mit ASP.NET Identity und Katana
Überblick über ASP.NET Identity
ASP.NET Identity verwenden
Überlegungen zur Implementierung eines eigenen UserStores
Formularbasierte Authentifizierung mit Katana
Überblick über die CookieAuthenticationMiddleware vor dem Hintergrund formularbasierter Authentifizierung
CookieAuthenticationMiddleware für formularbasierte Authentifizierung konfigurieren
Benutzer anmelden
Benutzer abmelden
Claims in Action-Methoden verwenden
Authentifzierung mit externen Identitätsanbietern, wie Google oder Facebook mit Katana
Middleware registrieren
Registrierte Login-Provider abrufen
Authentifizierung durch externen Login-Provider veranlassen
Weiterführende Konfigurationsmöglichkeiten
Benutzerdefinierte Authentifizierungs-Middleware-Komponenten mit Katana entwickeln
Überblick über Authentifizierungs-Middleware-Komponenten
Benutzerdefinierte Implementierung von HTTP BASIC
Umsetzung einer Middleware für HTTP BASIC
Einsatz als passive Authentifizierungs-Middleware
Kommunikation zwischen Anwendungscode und Middleware-Komponenten
Kommunikation zwischen Authentifizierungs-Middleware-Komponenten
Single-Sign-On und weiterführende Szenarien mit OAuth 2.0, OpenID Connect und Katana
OAuth 2.0
Rollen
Access- und Refresh-Token
Single-Sign-On mit OAuth 2 und OpenID Connect
JSON-Web-Token
Flows
Authorization Code Grant-Flow
Implicit Grant-Flow
Resource Owner Password Credentials Grant
Client Credentials Grant
Eine OAuth 2.0-Implementierung mit ASP.NET MVC 5 und ASP.NET Web API 2
Katana-Middleware-Komponenten für OAuth 2.0 registrieren
Datenformate
Einen OAuthAuthorizationServerProvider für den Resource Owner Password Credentials Grant implementieren
Den Resource Owner Password Credentials Grant testen
Neues Access-Token mit Refresh-Token anfordern
Via OpenID Connect ein Identitäts-Token ausstellen
Serviceaufrufer mit einem über OpenID Connect ausgestellten JWT authentifizieren
Authorization Code Grant und Implicit Grant implementieren
Weiterführende Überlegungen zur Authentifizierung des Benutzers beim Einsatz des Authorization Code Grants sowie Implicit Grants
Access-Token über Authorization Code Grant anfordern
Access-Token über Implicit Grant anfordern
Katana-Middleware für Single-Sign-On über Authorization Code Grant und OpenID Connect realisieren
Federated Security mit dem JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants
Implementierung des JWT Profile for OAuth 2.0 Client Authentication and Authorization Grants zur Realisierung von Verbundsicherheit
Authentifizieren von JavaScript-Clients mit OAuth 2.0
JavaScript-Client mit Resource Owner Password Credentials Grant authentifizieren
JavaScript-Client mit Implicit Grant authentifizieren
Single-Sign-On mit WIF
Verweis auf STS einrichten
Konfigurieren von ASP.NET-Projekten für den Einsatz mit WIF
Übermittelte Claims prüfen
Programmatisches Anfordern einer Anmeldung
Sitzungscookie für Claims erstellen
9. ASP.NET MVC und ASP.NET Web API erweitern
ASP.NET MVC erweitern
DependencyResolver
ModelBinder
ModelBinder anpassen
Validierende Modellbindung
ModelBinder auf traditionellem Weg registrieren
ModelBinder über DependencyResolver bereitstellen
ValueProvider
Benutzerdefinierter ValueProvider
ValueProvider mit ValueProviderFactories erzeugen
ValueProviderFactory über DependencyResolver bereitstellen
ModelValidatorProvider
Benutzerdefinierter ModelValidatorProvider
ModelValidationProvider auf traditionellem Weg bereitstellen
ModelValidationProvider über DependencyResolver bereitstellen
MetadataProvider
Ein einfacher MetadataProvider
MetadataProvider auf traditionellem Weg registrieren
MetadataProvider über DependencyResolver bereitstellen
Benutzerdefinierte Metadaten
Performanceverbesserung durch das Zwischenspeichern von Metadaten
View-Helper
View-Helper bereitstellen
Benutzerdefinierte View-Helper aufrufen
Mit View-Helper auf Modell zugreifen
Basisklasse für Razor-Views ändern
Action-Methoden mit ActionMethodSelectorAttribut auswählen
Benutzerdefinierte ActionMethodSelectorAttribut-Implementierungen bereitstellen
ActionMethodSelectorAttribute anwenden
ActionNameSelectorAttribute
Controller mit ControllerFactory auswählen
Benutzerdefinierte ControllerFactory
ControllerFactory auf traditionellem Weg registrieren
ControllerFactory und DependencyResolver
View-Engine
Benutzerdefinierte Pfade für Views mit benutzerdefinierter View-Engine
View-Engine auf traditionellem Weg registrieren
View-Engine über DependencyResolver bereitstellen
Benutzerdefiniertes Rendering mit benutzerdefinierter View-Engine
Benutzerdefiniertes ActionResult
ASP.NET Web API erweitern
Abhängigkeiten auflösen mit benutzerdefiniertem DependencyResolver
Methodenparameter auf benutzerdefinierte Weise mit HttpParameterBinding binden
Zusätzliche Assemblies mit AssembliesResolver laden
Service-Operationen über HttpActionSelector auswählen
Controller über HttpControllerSelector auswählen
10. Testbare Systeme mit Dependency-Injection
Fallbeispiel ohne Dependency-Injection
Implementierung mit ASP.NET MVC
Komponententests (engl. Unit Tests)
Diskussion der betrachteten Lösung
Fallbeispiel mit Dependency-Injection
Implementierung der Webanwendung
Brückenschlag zwischen ASP.NET MVC und Unity
Testen
Zusammenfassung und Fazit
Stichwortverzeichnis
Impressum
Das Web hat sich verändert. Während für gute Webanwendungen vor rund 10 Jahren noch die Regel galt, so viele Aufgaben wie möglich auf dem Server zu erledigen, machen moderne Web-Systeme exzessiv von clientseitigen Techniken, allen voran JavaScript, Gebrauch, um die Benutzerfreundlichkeit zu steigern und sich so von Konkurrenz-Produkten abzuheben. Dank HTML 5 können nun auch offlinefähige Webanwendungen entwickelt werden, sodass Webtechniken eine ernstzunehmende Alternative zu klassischen Plattformen für die Entwicklung von Desktop-Clients darstellen. Darüber hinaus werden moderne Webanwendungen den klassischen mehrschichtigen Anwendungen, die sich auf bereitgestellte Services abstützen und von ihnen gezielt Informationen beziehen, immer ähnlicher.
Auch im Bereich mobiler Endgeräte spielen moderne Websysteme eine wichtige Rolle, zumal sie derzeit sowie in absehbarer Zukunft die einzige Technologie zur Entwicklung plattformübergreifender Lösungen darstellen: Egal ob auf dem iPhone, auf der Android-Plattform oder unter Windows (Phone) 8: Webtechnologien werden überall unterstützt.
Das vorliegende Buch präsentiert einen Technologie-Mix, mit dem .NET-Entwickler solche modernen Webanwendungen entwickeln können. Dabei wird auf serverseitige Technologien wie ASP.NET MVC, ASP.NET Web API oder das Entity Framework ebenso eingegangen wie auf clientseitige Konzepte, ohne die die beschriebene Art von Anwendungen nicht möglich wäre. Zu diesen clientseitigen Technologien zählen jQuery, jQuery Mobile, TypeScript sowie HTML-5-APIs für offinefähige Web-anwendungen. Daneben widmet dieses Buch dem populären JavaScript-Framework AngularJS, das die Erstellung JavaScript-getriebener Anwendungen erleichtert und ein großes Augenmerk auf die Aspekte Testbarkeit und Wartbarkeit legt, ein eigenes Kapitel. Auch das Thema Sicherheit wird umfangreich behandelt, indem neben klassischen Szenarien auch auf erweiterte Ansätze wie Single-Sign-On und die Delegation von Rechten eingegangen wird. Hierzu geht das vorliegende Werk nicht nur auf moderne und weit verbreitete Protokolle wie OAuth 2.0 und Open Id Connect ein, sondern zeigt auch auf, wie diese Protokolle mit den jüngsten Neuerungen im Bereich der ASP.NET-Familie implementiert werden können. Eine Diskussion über Dependency Injection zur Steigerung der Testbarkeit am Ende des Buchs rundet den vermittelten Stoff ab.
Das Buch richtet sich an Softwareentwickler, die bereits grundlegende Erfahrung mit .NET und C# sowie mit Webtechnologien, allen voran JavaScript, HTML und HTTP, haben und moderne Web-Anwendungen entwickeln wollen.
Zielsetzung dieses Buchs ist es, dem Leser zu zeigen, wie die eingangs erwähnten Technologien eingesetzt werden können, um moderne Web-Anwendungen zu schaffen. Der Fokus liegt dabei auf den Konzepten, die hinter diesen Technologien stehen. Dazu spielt dieses Buch eine Vielzahl an Beispielen durch.
Es ist nicht das Ziel dieses Buchs, ein erschöpfendes Nachschlagewerk für die Vielzahl der von den genannten Frameworks bereitgestellten Klassen und Methoden zu sein. Für eine erschöpfende Auflistung sämtlicher Funktionen wird, gerade bei den clientseitigen Technologien, auf die umfangreichen frei verfügbaren Online-Referenzen verwiesen. Darüber hinaus gehen die Autoren auch davon aus, dass der Leser mit wenig Aufwand herausfinden kann, in welchem Namensraum bzw. in welcher Assembly sich eine erwähnte Klasse befindet, sofern diese nicht ohnehin durch die in Visual Studio verwendeten Vorlagen eingebunden wurden.
Das Buch wurde in Hinblick auf die nachfolgend genannten Framework-Versionen aktualisiert und erweitert. Die Beschreibung des JavaScript-Frameworks knockout.js wurde durch ein umfangreiches Kapitel, welches auf das mächtigere und weiter verbreitete Framework AngularJS eingeht, ersetzt. Der überwiegende Teil des Kapitels zum Thema Sicherheit wurde neu geschrieben, sodass es sich am neu eingeführten Framework ASP.NET Identity und dem Projekt Katana (Microsoft.Owin) orientiert. Auch die Möglichkeiten im Hinblick auf Self-Hosting-Szenarien werden nun vor dem Hintergrund von Katana beschrieben. Einige kleinere Kapitel wurden zusammengelegt und Leser-Feedback eingearbeitet. Daneben wurde das Kapitel zu JavaScript erweitert, sodass es nun unter anderem auf Twitter Bootstrap, IndexedDb, Promises und Globalize eingeht. Aus Platzgründen findet sich das Kapitel zu den Internet-Informationsdiensten (IIS) nicht mehr in dieser zweiten Auflage, zumal es auch stärker in den Bereich der Administration fällt. Es steht den Lesern jedoch über den Leserservice – weitere Informationen finden Sie am Ende des Vorworts – zum Download zur Verfügung.
In diesem Buch haben wir die folgenden typografischen Konventionen verwendet:
Kursiv:
Steht für Internet-Adressen wie zum Beispiel Domain-Namen und URLs sowie für neue Begriffe, wenn sie definiert werden.
Nichtproportionalschrift
Um die Lesbarkeit des Textes zu verbessern, werden Dateinamen, Funktionen, Methoden, Eigenschaften u.a. in Nichtproportionalschrift abgesetzt.
Dieses Symbol weist auf einen Tipp, einen Vorschlag oder eine allgemeine Anmerkung hin.
Dieses Symbol weist auf eine Warnung hin.
Das Buch behandelt Microsoft .NET Framework 4.5.1, ASP.NET MVC 5.1, ASP.NET Web API 2, ASP.NET SignalR 2 sowie Entity Framework 6.1 und AngularJS 1.2. Die verwendete Entwicklungsumgebung ist Visual Studio 2013.
Microsoft bietet neben Visual Studio auch noch eine Produktfamilie unter dem Titel »Visual Studio Express Editionen« an. Bei den Express-Editionen handelt es sich um größere Bausteine, die aus Visual Studio herausgebrochen wurden und jeweils für einen speziellen Anwendungsfall bereitstehen. Diese Express-Editionen sind kostenlos auf der Microsoft-Website (http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products) beziehbar. Sie können ohne Gebühren unbegrenzt verwendet werden. Die Express-Editionen reichen für die wichtigsten Anwendungstypen aus und die meisten der hier beschriebenen Aspekte können damit realisiert werden. Aus Platzgründen geht dieses Buch jedoch nicht auf die Unterschiede zwischen der verwendeten Version, welche oben genannt wurde, und den kostenfreien Express-Editionen ein.
Das vorliegende Buch verwendet serverseitig die Programmiersprache C# sowie clientseitig JavaScript.
Alle Leser, die serverseitig lieber mit Visual Basic .NET arbeiten, können die abgedruckten Beispiele sehr einfach mit kostenlosen Werkzeugen nach Visual Basic .NET konvertieren. Informationen dazu findet man unter http://www.dotnetframework.de/tools.aspx.
Dieses Buch beschreibt die englische Version von Visual Studio, weil inzwischen viele deutsche Entwickler (einschließlich der Autoren) die englische Version der Software bevorzugen, zumal die Übersetzungen ins Deutsche oft holprig sind und die Fehlermeldungen nur schwerer verständlich machen. Anwender einer anderen Sprachversion können über den Befehl Tools | Options | Environment | International Settings
weitere Sprachpakete herunterladen und einrichten. Weiterhin sei noch darauf hingewiesen, dass die Anordnung der Menüs und auch einige Tastaturkürzel von den gewählten Einstellungen in Visual Studio abhängen. Alle Ausführungen in diesem Buch beziehen sich auf die Umgebungseinstellung Common Settings, die bei der Installation des Produkts ausgewählt werden kann.
Den Lesern dieses Buchs werden von den Autoren folgende Serviceleistungen im Rahmen einer zugangsbeschränkten Website angeboten.
Der URL für den Zugang zum Leser-Portal lautet: http://www.dotnetframework.de/leser. Bei der Anmeldung müssen Sie das Kennwort Into Darkness angeben.
Downloads. Sie können alle in diesem Buch vorgestellten Codebeispiele hier herunterladen. Hier finden Sie außerdem ein Bonuskapitel zu den Internet-Informationsdiensten.
Diskussionsrunde. Ein webbasiertes Forum bietet die Möglichkeit, Fragen an die Autoren zu stellen. Bitte beachten Sie jedoch, dass dies eine freiwillige Leistung der Autoren ist und kein Anspruch auf eine kostenlose Betreuung besteht.
Newsletter. Alle registrierten Leser erhalten zwei- bis viermal jährlich einen Newsletter mit aktuellen Terminen und Publikationshinweisen.
Leserbewertung. Vergeben Sie Noten für dieses Buch und lesen Sie nach, was andere Leser von diesem Buch halten.
Errata. Trotz eines jahrelang erprobten Vorgehensmodells und der dreifachen Qualitätskontrolle (Co-Autor, Fachlektor, Verlag) ist es möglich, dass sich einzelne Fehler in dieses Buch eingeschlichen haben. Im Webportal können Sie nachlesen, welche Fehler gefunden wurden. Sie können hier auch selbst Fehler melden, die Ihnen auffallen.
Unseren Dank für ihre Mitwirkung an diesem Buch möchten wir aussprechen an
unsere Familienangehörigen, allen voran und in alphabetischer Reihenfolge Felix, Heidi, Kerstin und Maja, die uns neben unserem Hauptberuf das Umfeld geschaffen haben, auch an manchen Abenden und Wochenenden an diesem Buch zu arbeiten
Hans-Peter Grahsl von der FH CAMPUS 02, der wertvolles Feedback zum Kapitel über AngularJS gegeben hat, und Arno Hollosi von der FH CAMPUS 02, der regelmäßig im Zuge von Diskussionen wichtige Aspekte und Sichtweisen einbringt
die Microsoft Press-Lektoren Thomas Braun-Wiesholler und René Majer, die die erste Auflage dieses Buchs von der Verlagsseite aus betreut haben
die O’Reilly-Lektorin Ariane Hesse, die die vorliegende zweite Auflage dieses Buchs betreut hat
den Fachlektor Uwe Thiemann, der alle Texte inhaltlich geprüft hat
die Korrektorinnen Dorothee Klein und Karin Baeyens, die das Buch sprachlich verbessert haben und
Gerhard Alfes von mediaService, der sich um die optischen Aspekte des Buchs gesorgt hat
Graz & Essen, im März 2014
Manfred Steyer & Holger Schwichtenberg
Die beiden Autoren arbeiten bei der Firma www.IT-Visions.de als Softwarearchitekten, Softwareentwickler, Trainer und Berater für .NET-Techniken. www.IT-Visions.de ist ein Verbund der deutschen Top-Experten im Bereich der Microsoft-Produkte und -Technologien, insbesondere .NET. Unter Leitung und Mitwirkung des bekannten .NET-Experten Dr. Holger Schwichtenberg bietet www.IT-Visions.de:
Strategische und technische Beratung
Konzepte, Machbarkeitsstudien und Reviews
Coaching bei Entwicklungsprojekten
Technischen Support vor Ort und via Telefon, E-Mail oder Web-Konferenz
Individuell zugeschnittene technische Vor-Ort-Schulungen und anforderungsorientierte Workshops
Öffentliche Seminare (in Kooperation mit dem Heise-Verlag), siehe www.dotnet-akademie.de
Die Schwestergesellschaft 5Minds IT-Solutions GmbH & Co. KG bietet Softwareentwicklung (Prototypen und komplette Lösungen) sowie den Verleih von Softwareentwicklern.
Zu den Kunden gehören neben vielen mittelständischen Unternehmen auch Großunternehmen wie z.B. E.ON, Bertelsmann, EADS, Siemens, MAN, Bayer, VW, Bosch, ThyssenKrupp, Merkle, Fuji, Festo, Deutsche Post, Deutsche Telekom, Fielmann, Roche, HP, Jenoptik, Hugo Boss, Zeiss, IKEA, diverse Banken und Versicherungen sowie mehrere Landesregierungen.
Firmenwebsites: http://www.IT-Visions.de und http://www.5minds.de
Manfred Steyer ist Trainer und Berater bei www.IT-Visions.de sowie verantwortlich für den Fachbereich Software Engineering der Studienrichtung IT und Wirtschaftsinformatik an der FH CAMPUS 02 in Graz.
Er schreibt für das windows.developer magazin (vormals dot.net magazin) sowie Heise Developer und ist Buchautor bei O’Reilly, Microsoft Press sowie Carl Hanser. Manfred hat berufsbegleitend IT und IT-Marketing in Graz sowie Computer Science in Hagen studiert und kann auf mehr als 15 Jahre an Erfahrung in der Planung und Umsetzung von großen Applikationen zurückblicken. Er ist ausgebildeter Trainer für den Bereich der Erwachsenenbildung und spricht regelmäßig auf Fachkonferenzen.
In der Vergangenheit war Manfred Steyer mehrere Jahre für ein großes österreichisches Systemhaus tätig. In der Rolle als Bereichsleiter hat er gemeinsam mit seinem Team Geschäftsanwendungen konzipiert und umgesetzt.
Sein Weblog erreichen Sie unter www.softwarearchitect.at.
Seine E-Mail-Adresse lautet m.steyer@IT-Visions.at.
Studienabschluss Diplom-Wirtschaftsinformatik an der Universität Essen
Promotion an der Universität Essen im Gebiet komponentenbasierter Softwareentwicklung
Seit 1996 selbstständig als unabhängiger Berater, Dozent, Softwarearchitekt und Fachjournalist
Leiter des Berater- und Dozententeams bei www.IT-Visions.de
Leitung der Softwareentwicklung im Bereich Microsoft/.NET bei der 5minds IT-Solutions GmbH & Co. KG (www.5minds.de)
60 Fachbücher bei Microsoft Press, Addison-Wesley und dem Carl Hanser-Verlag und mehr als 700 Beiträge in Fachzeitschriften
Gutachter in den Wettbewerbsverfahren der EU gegen Microsoft (2006–2009)
Ständiger Mitarbeiter der Zeitschriften iX (seit 1999), dotnetpro (seit 2000) und Windows Developer (seit 2010) sowie beim Online-Portal heise.de (seit 2008)
Regelmäßiger Sprecher auf nationalen und internationalen Fachkonferenzen (z.B. TechEd, Microsoft IT Forum, BASTA, BASTA-on-Tour, Advanced Developers Conference, .NET-Entwicklerkonferenz, OOP, VS One, Wirtschaftsinformatik, Net.Object Days, Windows Forum, DOTNET-Konferenz, XML-in-Action)
Zertifikate und Auszeichnungen von Microsoft:
Microsoft Most Valuable Professional (MVP)
Microsoft Certified Solution Developer (MCSD)
Thematische Schwerpunkte:
Microsoft .NET Framework, Visual Studio, C#, Visual Basic
.NET-Architektur/Auswahl von .NET-Technologien
Einführung von .NET Framework und Visual Studio/Migration auf .NET
Webanwendungsentwicklung mit IIS, ASP.NET und AJAX
Enterprise .NET, verteilte Systeme/Webservices mit .NET
Relationale Datenbanken, XML, Datenzugriffsstrategien
Objektrelationales Mapping (ORM), insbesondere ADO.NET Entity Framework
Windows PowerShell (WPS) und Windows Management Instrumentation (WMI)
Ehrenamtliche Community-Tätigkeiten:
Vortragender für die International .NET Association (INETA)
Betrieb diverser Community-Websites www.dotnetframework.de, www.entwickler-lexikon.de, www.windows-scripting.de, www.aspnetdev.de u.a.
Weblog: http://www.dotnet-doktor.de
Kontakt: hs@IT-Visions.de sowie Telefon 0201 649590-0
ASP.NET MVC ist ein Framework aus der ASP.NET-Familie, welches zum einen das weit verbreitete MVC-Muster implementiert und dem Entwickler zum anderen die volle Kontrolle über die gerenderten Webseiten gibt. Es erlaubt das dynamische Rendern von Ressourcen wie z.B. HTML-Seiten auf der Serverseite. Dieses Kapitel zeigt, wie dieses Framework eingesetzt wird.
Bevor die ersten Codebeispiele folgen, beschäftigt sich dieser Abschnitt mit verschiedenen Überlegungen zum MVC-Muster. Darüber hinaus wird auf das MVVM-Muster (Model-View-ViewModel, auch als Model-View-Presenter bekannt) eingegangen, da dieses heutzutage häufig in Kombination mit MVC eingesetzt wird.
Die Abkürzung MVC steht für Model-View-Controller, ein Pattern, das ursprünglich bei Xerox für die Trennung von Logik und Präsentation entwickelt wurde. Es sieht vor, dass eine Applikation in drei Teile aufgeteilt wird: Model, View und Controller (Abbildung 1.1).
Das Modell entsprach dabei ursprünglich den fachlichen Daten sowie den darauf operierenden Routinen. Da diese beiden Aspekte heutzutage in der Regel voneinander getrennt werden, wird das Modell häufig lediglich mit den Daten der Applikation assoziiert und die Operationen für diese Daten, wie Laden, Speichern oder das Durchführen von Berechnungen, in eigene Klassen ausgelagert. Die Aufgabe der View ist das Anzeigen von Models sowie das Entgegennehmen von Benutzereingaben. Der Controller stellt das Bindeglied zwischen Modell und View dar: Er nimmt Anfragen sowie Benutzereingaben entgegen und wählt zur Abarbeitung der Anfrage eine passende Routine aus. Anschließend wird eine View ausgewählt sowie die anzuzeigenden Daten in Form eines Models an diese übergeben.
Abbildung 1.1 Das MVC-Muster
Durch diese Trennung können die einzelnen Teile separat wiederverwendet werden. Beispielsweise müssten bei einem Produkt, welches an das Design verschiedener Kunden anzupassen ist, lediglich die Views ausgetauscht bzw. modifiziert werden. Daneben erleichtert es das gleichzeitige Unterstützen verschiedener Benutzerschnittstellen – zum Beispiel eine für Mitarbeiter, eine weitere für Kunden und eine für mobile Endgeräte. Durch die Verteilung der einzelnen Aufgaben auf die Komponenten Modell, View und Controller wird auch eine eventuell gewünschte Arbeitsteilung vereinfacht. Webdesigner könnten sich beispielsweise um die View kümmern, Entwickler um den Controller sowie um die von ihm angestoßenen Routinen und Datenbankexperten um das Modell, welches sich ggf. auf einen O/R-Mapper, wie das ADO.NET Entity Framework, stützt. Da die gesamte Logik durch den Controller widergespiegelt wird, wird auch das Testen sowie das Automatisieren von Tests erleichtert.
Da dieselben fachlichen Daten in unterschiedlichen Views häufig unterschiedlich angezeigt werden, sieht das Muster MVVM (Model-View-ViewModel) vor, dass jede View ein eigenes Modell erhält, welches als ViewModel bezeichnet wird. Dieses basiert auf einem oder mehreren Models und bereitet deren Daten für die Verwendung innerhalb der View auf. Zusätzlich kann es auch Berechnungen durchführen oder benachbarte Objekte in einer »flachen« Struktur anbieten.
Beispielsweise könnte so für eine Rechnung auch die Anzahl der stattgefundenen Mahnungen über eine Eigenschaft angeboten oder die von der View zu verwendende Hintergrundfarbe in Hinblick auf das Hervorheben mehrfach gemahnter Rechnungen ermittelt werden. Darüber hinaus ist es auch nicht unüblich, im ViewModel Methoden zu hinterlegen, welche sich um die Verarbeitung der Daten (Validieren, Speichern, Laden, Berechnungen) kümmern oder die damit verbundenen Verarbeitungsvorgänge zumindest anstoßen, indem sie an die entsprechenden Klassen weiterdelegieren.
Abbildung 1.2 Das Muster MVVM (Model-View-ViewModel)
Beim Modell im Sinne von MVC handelt es sich somit, zumindest bei größeren Anwendungen, häufig um ein View-Modell, welches Daten für eine bestimmte View oder eine Gruppe von Views zur Verfügung stellt.