ASP.NET MVC6: Anwendungen in Bereiche (Areas) unterteilen

ASP.NET MVC6: Anwendungen in Bereiche (Areas) unterteilen

Bei großen ASP.NET Anwendungen wird es schnell unübersichtlich, wenn sich unzählige Klassen, Ordner und andere Ressourcen in einer Projektmappe aneinanderreihen. Die Aufteilung in mehrere Projekte wäre eine Möglichkeit. Allerdings ist dies nicht immer sinnvoll, weil es beispielsweise Performance-Probleme verursacht. Oder das Projekt keine wirklich sinnvolle Teilung hergibt. Eine gute Alternative sind dafür Bereiche, oder auch Areas genannt. Sie wurden mit MVC 2 eingeführt und ermöglichen es, ein Projekt in verschiedene Teilbereiche zu partitionieren. Jeder Bereich ist effektiv eine MVC-Anwendung mit eigenen Controllern, Models, Views und sogar Routen. Damit verhält sich eine Area ähnlich wie ein eigenständiges Projekt, aber ohne dessen Nachteile.

Anlegen eines neuen Bereiches

Um einen Bereich anzulegen, klickt man in Visual Studio mit der Rechten Maustaste auf das jeweilige Projekt, in dem der Bereich erzeugt werden soll. Anschließend auf Hinzufügen und den ersten Eintrag Bereich.

Anschließend öffnet sich ein Dialogfenster, in dem wir eine Bezeichnung für den neuen Bereich festlegen können:

Sollte dies der erste Bereich sein, fällt auf, dass nach wenigen Sekunden ein Ordner namens Areas im Hauptverzeichnis des Projektes angelegt wurde. In ihm befindet sich wiederum ein Unterordner mit dem soeben gewählten Namen. Dieser ist unterteilt in die gewohnte Ordnerstruktur einer MVC-Anwendung, mit Ausnahme von App_Start, App_Data und scripts:

Außerdem wurde eine C# Klasse mit dem Namen des Bereiches sowie dem Suffix AreaRegistration.cs erzeugt. Sie ersetzt gewisse Funktionen der Global.asax, wie man sie aus herkömmlichen ASP.NET MVC-Anwendungen ohne Bereiche kennt. Die Unterschiede werden allerdings in der Struktur sofort sichtbar: So erbt die Klasse von AreaRegistration. Wirft man einen Blick in die Global.asax Klasse des Projektes, findet man im Application_Start Event den Aufruf

AreaRegistration.RegisterAllAreas();

Dieser sorgt dafür, dass die Routen aller Bereiche (Areas) registriert werden, die von der Klasse erben. Um die Routen zu unterscheiden, setzt ASP.NET den Namen des Bereiches als virtuellen Ordner, der somit eine Art Präfix darstellt. In diesem Beispiel lautet er User. Selbstverständlich kann man wie bei jeder normalen Anwendung auch diese Routen jederzeit nach belieben ändern. Man muss nur darauf achten, dass die Routen eindeutig sind, und sich nicht mehreren Bereichen zuordnen lassen. Grundsätzlich macht ein Präfix daher Sinn.

Möchte man innerhalb seiner Anwendung auf einen anderen Bereich verlinken, kann man seinen Namen mithilfe einer anonymen Klasse an die Razor-Hilfsfunktionen wie beispielsweise Html.ActionLink() übergeben:

@Html.ActionLink("TestLink", "Index", "Test", new { area = "User"}, null)

Dies erzeugt einen Link mit dem Titel TestLink zur Action Index des Controllers mit dem Namen Test. Dieser befindet sich im Bereich User. Um insbesondere am Anfang die Übersicht zu behalten, kann man sich den Namen des akuellen Bereiches im der Razor-View ausgeben:

@{ 
    var routeData = ViewContext.RouteData;
}
Controller: @routeData.Values["controller"]
Action: @routeData.Values["action"]
Area: @routeData.DataTokens["area"]

Erzeugt beispielsweise folgende Ausgabe:

Leave a Reply