Moderne Webanwendungen mit ASP.NET MVC und JavaScript: ASP.NET MVC im Zusammenspiel mit Web APIs und JavaScript-Frameworks

Moderne Webanwendungen mit ASP.NET MVC und JavaScript: ASP.NET MVC im Zusammenspiel mit Web APIs und JavaScript-Frameworks

Manfred Steyer

Holger Schwichtenberg

Inhalt

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

Vorwort

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.

Für wen dieses Buch gedacht ist

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 des Buchs

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.

Unterschiede zur ersten Auflage

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.

Typografische Konventionen

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.

Tipp

Dieses Symbol weist auf einen Tipp, einen Vorschlag oder eine allgemeine Anmerkung hin.

Warnung

Dieses Symbol weist auf eine Warnung hin.

Behandelte Versionen

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.

Express-Editionen

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.

Verwendete Programmiersprache

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.

Sprachversion

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.

Leserservice

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.

Danksagungen

Unseren Dank für ihre Mitwirkung an diesem Buch möchten wir aussprechen an

Graz & Essen, im März 2014

Manfred Steyer & Holger Schwichtenberg

Über www.IT-Visions.de

image with no caption

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:

image with no caption

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

Über den Autor Manfred Steyer

image with no caption

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.

Über den Autor Dr. Holger Schwichtenberg

image with no caption

Kapitel 1. ASP.NET MVC

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.

Architektur

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.

Model-View-Controller (MVC)

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.

Das MVC-Muster

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.

Überblick über MVVM (Model-View-ViewModel)

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.

Das Muster MVVM (Model-View-ViewModel)

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.