20.06.2010, 22:41 Uhr

ASP.NET MVC 2 - ein Beispiel für eine praktische Implementierung

Zum Abschluss der dreiteiligen Serie über das ASP.NET MVC Framework wird eine kleine Webanwendung umgesetzt, die auf dem Model View Controller-Muster basiert und eine kleine Personenverwaltung darstellt.
von Marc André ZhouBevor es mit der Umsetzung eines Softwareprojekts los geht, erfolgt in der Regel eine fachliche Anforderungsanalyse. Darauf aufbauend wird ein Pflichtenheft erstellt, das die Anforderung an die Anwendung zusammenstellt. Stehen die Anforderungen fest, kann mit der Umsetzung begonnen werden. Da die Umsetzung einer Anwendung nicht planlos erfolgen soll, muss an dieser Stelle zunächst die (Software-) Architektur der Anwendungen definiert werden. Bei der Verwendung des ASP.NET MVC Framework wird dieser Schritt erheblich vereinfacht, da die Aufteilung durch das Framework vorgegeben wird.Wie es bereits in der Einführung zum ASP.NET MVC Framework erläutert wurde [1], besteht dieses aus den drei Komponenten Model (M), View (V) und Controller (C). Da das MVC Framework einen Test Driven Development (TDD) Prozess unterstützt, können die Komponenten in der Theorie losgelöst voneinander entwickelt werden. Als optimale Entwicklungsreihenfolge hat sich die Reihenfolge bewährt, nach der zuerst die Model-, anschließend die Controller- und zum Schluss die View-Klassen realisiert werden. Diese Reihenfolge wird für die Umsetzung des Beispiels, das dieser Folge zugrundeliegt, ebenfalls verwendet. Als Beispielanwendung wird eine einfache Personenverwaltung umgesetzt. Die Datenbank besteht lediglich aus den Tabellen Person und Adresse. Abbildung 1 zeigt wie die beiden Tabellen zueinander in Beziehung stehen. Nachdem die Datenbank bereit steht, folgt die Anlage eines neuen ASP.NET MVC Framework Projekts in Visual Studio. Als Projektvorlage wird ASP.NET MVC 2 Empty Web Application verwendet (Abbildung 2). Die Projektvorlage richtet u. a. die vollständige Ordnerstruktur für die neue Anwendung ein. Abbildung 1: Der Aufbau der Datenbank Abbildung 2: Auswahl der ASP.NET MVC Empty Application-Vorlage Implementierung der Model-KlassenAls erstes werden die nötigen Model-Klassen implementiert.. Sie werden in dem dafür vorgesehenen Ordner Model abgelegt. Im einfachsten Fall handelt es sich hierbei um sog. POCO-Klassen (Plain Old Objects), die durch eine Datenzugriffsschicht mit Daten versorgt werden. Es existieren daher keine besonderen Anforderungen an diese Klassen. Für das Beispiel wird LINQ2SQL verwendet, um die Model-Klassen und Datenbankzugriffe zu realisieren. Bevor das LINQ2SQL-Modell erzeugt werden kann, muss eine Datenbankverbindung innerhalb des Visual Studio Server Explorers eingerichtet werden. Danach wird dem Projekt innerhalb des Ordners Models eine neue LINQ2SQL-Klasse hinzugefügt (Abbildung 3). Die beiden Tabellen werden im Anschluss daran vom Server-Explorer auf die Designer-Oberfläche der neu erstellten LINQ2SQL-Klasse gezogen. Abbildung 3: Eine LINQ2SQL-Klasse bildet das Datenmodell der AnwendungDie Umsetzung Model-Klasse ist damit schon beendet. Als nächstes folgt die Umsetzung der Controller-Klasse.Die Bereitstellung der Daten geschieht über die zuvor angelegte LINQ2SQL-Klasse. Eine Controller-Klasse nutzt die Model-Klasse, um die Daten abzurufen und der View-Klasse zur Verfügung zu stellen. Wie es unter [2] erläutert wurde, bietet das neue MVC Release auch eine verbesserte Visual Studio Integration. Die Anlage einer Controller-Klasse wird durch einen Assistenten vereinfacht. Abbildung 4 zeigt, wie dem Ordner Controllers mittels Assistenten die Controller-Klasse PersonenController hinzugefügt wird. Abbildung 4: Die Controller-Klasse wird durch einen Assistenten hinzugefügt Da bei der Generierung der Klasse die Option Add action methods for Create, Update, Delete and Details scenarios ausgewählt wurde, enthält die Klasse bereits alle wichtigen Methoden. Die Methoden sind natürlich zunächst leer und müssen im Anschluss mit der nötigen Logik versehen werden. Listing 1 zeigt die wichtigsten Methoden der Controller-Klasse. Die Funktionen der Methoden im Einzelnen sind:>Index = Übersicht über alle Objekte>Details = Anzeige der Details eines ausgewählten Objekts>Edit = Bearbeitung eines Objekts>Delete = Löschen eines ObjektesBeispielhaft werden im Folgenden die Methoden Index, Details und Edit realisiert. Listing 1 macht deutlich, dass zwei Edit Methoden existieren, die sich anhand ihrer Parameter sowie eines zusätzlichen Attributes unterscheiden. Die mit dem Attribut versehene Methode wird bei einem POST der Web-Seite aufgerufen und empfängt somit die geänderten Formularwerte. Bei dem Aufruf der Seite - es handelt sich um einen HTTP Get - wird die zweite Edit Methode verwendet. Diese ruft die Daten aus der Datenbank ab und übergibt diese der View. Für die Methoden Index und Details existieren nur GET-Methoden, da diese Oberflächen keine Bearbeitung der Daten zulassen. Die vollständige Implementierung der Index-Methode lautet wie folgt: public ActionResult Index() { return View( pdc.Persons );} Der View werden über den Parameter alle Personen-Objekte übergeben. Die Detail/Edit-Methode ist ähnlich aufgebaut, nur das hier lediglich ein bestimmtes Objekt geladen und übergeben wird:public ActionResult Details(int id) {return View(pdc.Persons.Where(p => p.ID == id).FirstOrDefault()); } Die Implementierung der zweiten Edit Methode erfolgt wenn die View Klassen fertig erstellt wurden.Nachdem die Methoden Index, Details und Edit vervollständigt wurden, können die View-Klassen angelegt werden. Auch für diesen Vorgang steht ein Assistent bereit. Über einen rechten Mausklick innerhalb der Controller-Methode und Add View wird der Assistent gestartet (Abbildung 5). Über den sich öffnenden Dialog (Abbildung 6) kann die Art der zu erstellenden View-Klasse bestimmt werden. Wichtig sind hierbei die Einstellungen "Create a strongly typed view", "View content" und "Select master page". Wird die Option "Create a strongly typed view" gewählt, kann aus der Auswahlliste View Data class die korrespondierende Model-Klasse ausgewählt werden. Über die Auswahlliste View content kann angegeben werden, welche Art von Oberfläche erstellt werden soll. Zur Auswahl stehen hier: Create, Delete, Details, Empty, Edit und List. Abbildung 5: Die View-Klassen werden ebenfalls über einen Assistenten hinzugefügt Abbildung 6: Im Auswahldialog wird auch die Art der hinzufügenden View ausgewählt Als erstes soll die Übersicht generiert werden, daher wird die Option List gewählt. Optional kann auch die MasterPage für die neue Detailseite angegeben werden. Nach Bestätigung der Angaben wird die View-Klasse angelegt. Danach kann die View über die URL http://[root]/Personenn direkt aufgerufen werden (Abildung 7). Die Anlage der weiteren View-Klassen verläuft analog dem hier gezeigten Beispiel.Implementierung des Edit-ModusBisher können Daten an der Oberfläche angezeigt werden, eine Bearbeitung ist aber derzeit noch nicht möglich. Um eine Aktualisierung der Daten zu ermöglichen muss noch die HTTP-Post Edit Methode vollständig implementiert werden. Wie bereits beschrieben wurde, wird diese Methode bei einem POST der Seite aufgerufen. Listing 2 zeigt die vervollständigte Edit-Methode. Im Vergleich zu Listing 1 wurde der zweite Parametertyp angepasst. Anstatt des unstrukturierten Typ FormCollection wird die eigene Model-Klasse Person verwendet. Dies ist dank starker Typisierung der View möglich. Bevor die Daten gespeichert werden, erfolgt über ModelState.IsValid eine Prüfung der Daten. Da die Model-Klasse bisher keine Regeln definiert, gibt diese Eigenschaft immer true zurück. Im Fall einer positiven Validierung wird zunächst über die ID das aktuelle Objekt aus dem Datenspeicher geladen. Danach wird das Objekt mit den neuen Werten überschrieben. Dafür kann die Methode UpdateModel verwendet werden, die per Reflection die Model-Klasse aktualisiert. Zum Schluss werden die Daten per SubmitChanges persistiert. Abbildung 7: Die View wird im Browser angezeigt AbschlussbetrachtungDas vorgestellte Beispiel veranschaulicht die grundlegenden Schritte zur Umsetzung einer ASP.NET MVC Framework-Anwendung. Es wurde deutlich, dass die Entwickler durch zahlreiche Assistenten in Visual Studio während der Implementierung unterstützt werden. Das umgesetzte Beispielprojekt steht als Download zur Verfügung und wartet darauf erweitert zu werden.Listing 1 - Eine typische Controller Klassepublic class PersonenController : Controller{public ActionResult Index() { ... }public ActionResult Details(int id) { ... }public ActionResult Create() { ... }[HttpPost]public ActionResult Create(FormCollection collection) { ... }public ActionResult Edit(int id) { ... }[HttpPost]public ActionResult Edit(int id, FormCollection collection) { ... }public ActionResult Delete(int id) { ... }[HttpPost]public ActionResult Delete(int id, FormCollection collection) { ... }} Listing 2 - Die Post Edit-Methodepublic ActionResult Edit(int id, Person person){try{if (ModelState.IsValid){Person orgPerson = pdc.Persons.Where(p => p.ID == id).FirstOrDefault();UpdateModel(orgPerson);pdc.SubmitChanges();}else return View(person);return RedirectToAction("Index"); }catch{return View(); }}Marc André Zhou ist Dipl. Inf. (FH) und Master of Science. Derzeit ist er für die Logica Deutschland GmbH & Co. KG als Senior Consultant tätig. Weitere Informationen zu seinen Artikelln finden Sie in seinem Blog unter http://www.sw-consultant.de.Links[1] http://www.computerworld.ch/aktuell/news/50932/index.html - die Unterschiede zum ASP.NET WebForm-Modell[2] http://www.computerworld.ch/aktuell/news/51270/index.html - die Neuerungen von ASP.NET MVC Release 2 Peter Monadiemi


Das könnte Sie auch interessieren