{"id":3509,"date":"2016-03-23T19:39:16","date_gmt":"2016-03-23T18:39:16","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=3509"},"modified":"2016-03-23T19:39:16","modified_gmt":"2016-03-23T18:39:16","slug":"asp-net-mvc6-anwendungen-in-bereiche-areas-unterteilen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/asp-net-mvc6-anwendungen-in-bereiche-areas-unterteilen\/","title":{"rendered":"ASP.NET MVC6: Anwendungen in Bereiche (Areas) unterteilen"},"content":{"rendered":"<p>Bei gro\u00dfen ASP.NET Anwendungen wird es schnell un\u00fcbersichtlich, wenn sich unz\u00e4hlige Klassen, Ordner und andere Ressourcen in einer Projektmappe aneinanderreihen. Die Aufteilung in mehrere Projekte w\u00e4re eine M\u00f6glichkeit. 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\u00fcr Bereiche, oder auch Areas genannt. Sie wurden mit MVC 2 eingef\u00fchrt und erm\u00f6glichen es, ein Projekt\u00a0in verschiedene Teilbereiche\u00a0zu partitionieren. Jeder Bereich ist effektiv eine MVC-Anwendung mit eigenen Controllern, Models, Views und sogar Routen. Damit verh\u00e4lt sich eine Area\u00a0\u00e4hnlich wie ein eigenst\u00e4ndiges Projekt, aber ohne dessen\u00a0Nachteile.<\/p>\n<h3><strong>Anlegen eines neuen Bereiches<\/strong><\/h3>\n<p>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\u00dfend auf\u00a0<strong>Hinzuf\u00fcgen<\/strong> und den ersten Eintrag\u00a0<strong>Bereich<\/strong>.<\/p>\n<p><a href=\"https:\/\/u-img.net\/img\/5287Ns.png\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/5287Ns.png\" alt=\"\" \/><\/a><\/p>\n<p>Anschlie\u00dfend \u00f6ffnet sich ein Dialogfenster, in dem wir eine Bezeichnung f\u00fcr den neuen Bereich festlegen k\u00f6nnen:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/4757Fm.png\" alt=\"\" \/><\/p>\n<p>Sollte dies der erste Bereich sein, f\u00e4llt auf, dass nach wenigen Sekunden ein Ordner namens\u00a0<strong>Areas<\/strong> im Hauptverzeichnis des Projektes angelegt wurde. In ihm befindet sich wiederum ein Unterordner mit dem soeben gew\u00e4hlten Namen. Dieser ist unterteilt in die gewohnte Ordnerstruktur einer MVC-Anwendung, mit Ausnahme von App_Start, App_Data und scripts:<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/u-img.net\/img\/4212Ll.png\" alt=\"\" \/>Au\u00dferdem wurde eine C# Klasse mit dem Namen des Bereiches sowie dem Suffix\u00a0<strong>AreaRegistration.cs<\/strong> erzeugt. Sie ersetzt\u00a0gewisse Funktionen der Global.asax, wie man sie aus herk\u00f6mmlichen ASP.NET MVC-Anwendungen ohne Bereiche kennt.\u00a0Die Unterschiede werden allerdings in der Struktur sofort sichtbar: So erbt die Klasse von\u00a0<strong>AreaRegistration<\/strong>. Wirft man einen Blick in die Global.asax Klasse des Projektes, findet man im Application_Start Event den Aufruf<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nAreaRegistration.RegisterAllAreas();\r\n<\/pre>\n<p>Dieser sorgt daf\u00fcr, 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\u00e4fix darstellt.\u00a0In diesem Beispiel lautet er\u00a0<strong>User<\/strong>. Selbstverst\u00e4ndlich kann man wie bei jeder\u00a0<em>normalen<strong>\u00a0<\/strong><\/em>Anwendung auch diese Routen jederzeit nach belieben \u00e4ndern. Man muss nur darauf achten, dass die Routen eindeutig sind, und sich nicht mehreren Bereichen zuordnen lassen. Grunds\u00e4tzlich macht ein Pr\u00e4fix daher Sinn.<\/p>\n<p>M\u00f6chte 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() \u00fcbergeben:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n@Html.ActionLink(&quot;TestLink&quot;, &quot;Index&quot;, &quot;Test&quot;, new { area = &quot;User&quot;}, null)\r\n<\/pre>\n<p>Dies erzeugt einen Link mit dem Titel\u00a0<strong>TestLink<\/strong> zur Action\u00a0<strong>Index<\/strong> des Controllers mit dem Namen\u00a0<strong>Test<\/strong>. Dieser befindet sich im Bereich\u00a0<strong>User<\/strong>.\u00a0Um insbesondere am Anfang die \u00dcbersicht zu behalten, kann man sich den Namen des akuellen Bereiches im der Razor-View ausgeben:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n@{ \r\n    var routeData = ViewContext.RouteData;\r\n}\r\nController: @routeData.Values&#x5B;&quot;controller&quot;]\r\nAction: @routeData.Values&#x5B;&quot;action&quot;]\r\nArea: @routeData.DataTokens&#x5B;&quot;area&quot;]\r\n<\/pre>\n<p>Erzeugt beispielsweise folgende Ausgabe:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/6495Bj.png\" alt=\"\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei gro\u00dfen ASP.NET Anwendungen wird es schnell un\u00fcbersichtlich, wenn sich unz\u00e4hlige Klassen, Ordner und andere Ressourcen in einer Projektmappe aneinanderreihen. Die Aufteilung in mehrere Projekte w\u00e4re eine M\u00f6glichkeit. 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\u00fcr Bereiche, oder auch &#8230;<\/p>\n","protected":false},"author":5,"featured_media":3517,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[414,413,416,426,415],"class_list":["post-3509","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-areas","tag-asp-net-mvc","tag-asp-net-mvc5","tag-asp-net-mvc6","tag-bereiche"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=3509"}],"version-history":[{"count":10,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3509\/revisions"}],"predecessor-version":[{"id":3685,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3509\/revisions\/3685"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/3517"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=3509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=3509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=3509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}