4. Model View Controller
Dieses Kapitel beschreibt die grundlegenden Bausteine einer ASP.NET Core-Applikation, die zur Seitenerstellung auf MVC (Model View Controller) aufsetzt.
4.1 Grundlagen
Das Model View Controller-Konzept (MVC) ist eine etablierte Strategie, Programme mit grafischen Benutzeroberflächen zu entwerfen. MVC ist ein Entwurfsmuster, welches selbst andere Entwurfsmuster verwendet. Es wurde 1978 im XEROX PARC für Smalltalk entwickelt. Die Einführung von MVC war ein großer Schritt in der GUI -Entwicklung. Nach und nach hielt dieses Entwurfsmuster in vielen Desktopanwendungen Einzug. Inzwischen ist es Standard bei der Entwicklung einer Anwendung mit Benutzeroberfläche. Mittlerweile wird es auch im Zusammenhang mit Webanwendungen verwendet.
Der Kerngedanke besteht darin, Daten, Präsentation und Interaktion voneinander zu trennen. Auf diese Weise wird eine Anwendung übersichtlicher und leichter wartbar. Der folgende Abschnitt gibt einen Überblick über die Funktionsteile.
Gibt es Alternativen zum MVC und C#? Nein. Mit MVC wird derzeit ein sehr rigider Bruch mit der Vergangenheit gefahren:
- WebForms werden nicht mehr unterstützt (kein .aspx mehr)!
- Visual Basic wird nicht mehr unterstützt (kein .vbhtml mehr)!
Das MVC-Entwurfsmuster
Das Entwurfsmuster Model View Controller besteht im Wesentlichen aus drei Teilen.
Modell (model)
Das Modell stellt einen Zugriff auf die Daten zur Verfügung. Bei den meisten Implementierungen ist das Modell eine Klasse, welche die zu verarbeitenden Daten definiert, beispielsweise eine Person mit Name und Anschrift. In einer Anwendung, die auf einer SQL-Datenbank basiert, würde der Zugriff auf die Daten, sowie die Überprüfung der Konsistenz der Daten, innerhalb des Modells erfolgen.
Es bietet sich an, das Entwurfsmuster “Beobachter” (Observer) für das Modell zu implementieren. Auf diese Weise können andere Schichten, wie beispielsweise die Präsentation, über Änderungen informiert werden.
Präsentation (view)
Die Präsentationsschicht ist nur für die Darstellung von Informationen und gegebenenfalls die Bereitstellung von Bedienelementen zur Benutzerinteraktion zuständig, beispielsweise von Schaltflächen, Eingabefeldern oder Links.
Das Modell sollte die Präsentation über Änderungen informieren, sodass gegebenenfalls neue Daten dargestellt werden können. Ein Modell kann mehr als eine Präsentation haben.
Steuerung (controller)
Alle Aktionen werden in der Steuerungsschicht durchgeführt. Eine Steuerung kann mehrere Präsentationsschichten bedienen. Dabei werden Aktionen der Bedienelemente aus der Präsentationsschicht entgegengenommen, ausgewertet und die Daten im Modell entsprechend verarbeitet oder aktualisiert.
URL-Routing
Um die Trennung in Modell, Präsentation und Steuerung zu ermöglichen, muss es einen Weg geben, die angeforderte Webadresse auf ein Objekt bzw. die passende Methode (Action) zu verbinden. Dies wird Routing genannt. Das MVC-Framework verfügt über eine extrem leistungsfähige Routing-Komponente, welche bereits einen großen Teil der Vorverarbeitung einer Anforderung übernehmen kann.
4.2 Routing
Das ASP.NET-Routing wird immer dann aktiv, wenn keine konkrete Datei auf der Festplatte adressiert wird. Da die URL keine konkrete Datei betrifft, sind Sie bei der Wahl der Form des URL (fast) völlig frei. Diese Freiheit ermöglicht systematische, beschreibende und damit wartungsfreundliche Formen.
Der übliche Aufbau eines URL ist die folgende Form:
- http://servername/area/controller/action/parameter
Dabei kann jeder Bestandteil entfallen und die Parameter können beliebig ergänzt werden. Die Abfragezeichenfolgen – der QueryString – kann an diesen Pfad noch angehängt werden. Er kann weitere Parameter enthalten, die mit den im Pfad bereits definierten Paramatern gleichwertig verarbeitet werden. Die Definition des Routing muss all Parametervarianten vordefinieren. Dies ist mit dem QueryString nicht erforderlich. Oft wird deshalb eine Mischung aus beiden benutzt.
Routen
Eine Route ist ein Muster für eine bestimmte Struktur eines URL. Der Route liegt ein Mapping zugrunde, also ein Verfahren zum Verbinden von Pfadangaben zu einem Ziel. Das Ziel ist in ASP.NET ein Handler – eine aktive Komponente, die für die Verarbeitung zuständig ist. Routen können darüber hinaus Namen haben, die der Organisation dienen, nach außen aber nicht in Erscheinung treten. Routen werden in einer Collection gespeichert und in der Reihenfolge verarbeitet, wie sie dort definiert wurden. Es ist deshalb wichtig, das generische Routen mit sehr allgemeiner Struktur am Ende definiert werden. Spezielle Routen würden sonst niemals erreicht werden.
Die Konstruktion der Route basiert auf einem speziellen Trennzeichen, dem Schrägstrich “/”. Dies ist der Standard. Grundsätzlich ist jedes literale Zeichen ohne besondere Bedeutung geeignet, insbesondere “-“, “~”, “_” und “.”. Sonderzeichen in einer URL sind dagegen:
- ?: Abtrennung des QueryString
-
5. : Hash für interne Seitensprünge
- =: Trennzeichen für QueryString-Werte
- &: Trennzeichen für QueryString-Parameter
Einige Zeichen sind aufgrund der Bedeutung bei Pfadangaben zu vermeiden: ! # $ % ‘ ( ) * + , : ; @ [ ].
Innerhalb der Definition werden Platzhalter für dynamische Teile benutzt, die in geschweiften Klammern stehen. Ein typisches Muster könnte etwa folgendermaßen aussehen (die Sprach- und Landesanteile sind erkennbar):
- {language}-{country}/{action} : de-DE/show
Die folgende Angabe ist dagegen ungültig (die Sprach- und Landesanteile sind nicht trennbar):
- {language}{country}/{action} : deDE/show
Hier fehlt das literale Trennzeichen zwischen den ersten beiden Variablen.
5.1 Views
Views dienen der Darstellung. Sie erzeugen das HTML, dass der Browser zur Darstellung benötigt. MVC-Views nutzen als Sprache für interaktive Elemente Razor. Mittels Razor lassen sich C#-Sprachelemene in HTML einbetten. Serverseitig werden diese Elemente dann ausgewertet und in Text übersetzt, der in die HTML-Seite integriert wird. In ASP.NET Core wurde die Notwendigkeit Razor zu benutzen stark zurückgedrängt. So elegant dieses Konzept auf den ersten Blick erscheint, so schwierig erscheint die Darstellung bei komplexen Seiten. Stattdessen werden viele Hilfsfunktionen nun als HTML-Attribute abgebildet.