In der zweite Version des MVC Frameworks für ASP.NET wurden sog. “Areas” eingeführt. Mit Areas können Controller thematisch gruppiert und als Unterprojekt verwaltet werden. Jede Area bekommt eine eigene Ordnerstruktur mit “Controllers”, “Models” und “Views” und enthält damit zu den Controllern die entsprechenden Views und Models. Eine Area kann als separates Modul betrachtet und entwickelt werden. Große und komplexe Projekte können in kleine überschaubare Module gegliedert werden.
Vorteile ergeben sich besonders, wenn Module tatsächlich unabhängig voneinander implementiert werden. So können wiederkehrende oder zentrale Komponenten wie “Blog”, “Wiki” oder “Benutzeradministration” zentral implementiert und weiterentwickelt werden. Projekte, welche diese Komponenten verwenden, können auf diese Module verweisen oder bei kundenspezifischen Anpassungen einen bestimmten Entwicklungsstand verwenden und anpassen.
Areas anlegen und verwenden
Areas werden im Visual Studio über das Kontextmenü “Hinzufügen” –> “Bereich/Area” hinzugefügt. Nach der Eingabe des Namens werden die Verzeichnisse und die Infrastruktur für das erweiterte Routing (“[Area-Name]AreaRegistration.cs”) angelegt. Die Area-Registration erbt von einer Klasse “AreaRegistration” um die Routen separiert pro Modul definieren zu können. Dadurch wird eine absolute Unabhängigkeit der Module realisiert.
Für Links innerhalb der Applikation kann weiterhin die “Html.ActionLink()” Methode verwendet werden. Es muss nur ein weiteres Routing-Schlüsselwort “Area” in den RouteValues für die Ziel-Area definiert werden. Zu beachten ist allerdings die polymorphe Signatur der Methode.
<li><%: Html.ActionLink("Admin", "Index", "Default", new {Area = "Admin"}) %></li>
<li><%: Html.ActionLink("Admin", "Index", "Default", new {Area = "Admin"}, new {}) %></li>
Die 2. Zeile scheint gleich zu sein, da der Parameter leer ist. Der leere Parameter bewirkt aber den Aufruf einer anderen Methode wegen einer anderen Methodensignatur. Im ersten Fall wird der Parameter mit der Area Definition als “HtmlAttributes” interpretiert. In zweiten Fall wird der leere Parameter als “HtmlAttributes” interpretiert und die Area Definition wird zu "RouteValues”.
Die Methode “ActionLink()” arbeitet relativ zu der aktuellen Area. Befindet man sich in der Root Area ist alles kein Problem. Befindet man sich allerdings innerhalb einer Area wird als Default die aktuelle Area verwendet. Wichtig wird das bei zentralen Menüs oder in der Masterpage. Die Masterpage eines Standard MVC2 Projektes enthält Links auf die Startseite (DefaultController –> Index) ohne Angabe einer Area. Innerhalb einer Area wird daraus der Link auf die Startseite der Area (Area/DefaultController –> Index). Der Link unabhängig von der Area auf die Startseite muss also mit leerer Area erfolgen:
<li><%: Html.ActionLink("Admin", "Index", "Default) %></li>
<li><%: Html.ActionLink("Admin", "Index", "Default", new {Area = ""}, new {}) %></li>
Zwei Controller, ein Name
Gibt es in einem Projekt zwei Controller mit dem gleichen Namen funktioniert die automatisch generierte Default-Route nicht mehr. Das MVC Framework ist nicht in der Lage ohne Angabe des Namespaces den richtigen Controller zu finden, das MVC nur den Kurznamen kennt. Der Default-Route muss in einem solchen Fall der Namespaces des Default-Controlles als Parameter mitgegeben werden.
routes.MapRoute(
"Default", // Routenname
"{controller}/{action}/{id}", // URL mit Parametern
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameterstandardwerte
new [] {"SmartHome.Mvc"} // Namespace
);
Shared Views
Bei der Verwendung der Shared Views ist zu berücksichtigen, dass bei automatisch ermittelten Controls erst in der betreffenden Area und anschließend in der Root Area nachgeschlagen wird. Interessant werden diese Aspekte bei z.B. EditorTemplates oder DisplayTemplates. So können Views zentral bereitgestellt und für Areas separat überschrieben werden.
Fazit
Areas sind eine sehr gute Erweiterung des Frameworks. Sind die Stolpersteine bekannt können Areas intuitiv verwendet werden. Besonders im Hinblick auf die modulare Entwicklung von Komponenten bieten sich hier viele Möglichkeiten. Durch das Verwenden eines Team Foundation Servers und Workspacedefinitionen ist ein Zusammenstecken einer Applikation sehr einfach, da wirklich auf die Module innerhalb eines andern Ordners im TFS verwiesen werden kann.
