ASP.NET MVC Framework – Separation of Concerns in Views

Von Andreas Aschauer Autor Feed 7. August 2009 12:34

SoC – Separation of Concerns ist eines der grundlegensten Design Prinzipien in der objekt-orientierten Softwareentwicklung. Durch die immer grössere Verbreitung von Tools die automatisch Code generieren, wird dieses Prinzip jedoch oft grob vernachlässigt (Stichwort “Datenzugriff & Businesslogik direkt im ‘Click’ Event Handler :-) )

Auch mit dem ASP.NET MVC Framework kann man sich bequem Views auf Basis von Objekten automatisch erzeugen lassen. Idealerweise sollte aber ein Controller immer nur genau eine Aufgabe haben. Also ein CustomerController sollte die CRUD Operationen für das Model Customer erledigen sonst nichts. Das heisst er sollte die Views generieren und den Input validieren, die CRUD Operationen an sich sollten natürlich an ein Repository oder ein Service welches zuständig ist delegiert werden –> (SoC !)

Angenommen wir haben einen EmployeeController . Der EmployeeController generiert Views für Angestellte. Sollen nun für eine Detailansicht eines Angestellten auch eine Liste aller Projekte in der der Mitarbeiter aktiv ist angezeigt werden, so ist das eigentlich die Aufgabe des ProjectControllers.

Gelöst wird das mit der RenderAction() Methode aus der ASP.NET MVC Futures Assembly.

   1: <%   1:  Html.RenderAction("List", "Project", new {employeeId = Model.EmployeeId}); 

Der Aufruf geht an den ProjectController und ruft die Mehthode List(int employeeId) auf, wobei die EmployeeId als Parameter übergeben wird. Somit wird die View welche aus der Methode generiert wird einfach in die Stelle des Aufrufs eingefügt. Somit kann eine View auch aus “Widgets” zusammengebaut werden, was in Zeiten von WebParts sowieso “In” ist. Zu beachten ist, dass RenderAction keinen Rückgabewert hat somit entfällt das = nach der öffnenden Klammer!

Eine weitere Möglichkeit Layout zu “Kapseln” ähnlich den UserControls in klassischem ASP.NET ist die verwendung von PartialViews.

Angenommen es soll zu einem Mitarbeiter die Adresse angezeigt werden in einem vorher standardisierten Format. Wird die Anzeige von Adressen an mehreren Stellen der Anwendung benötigt, muss dieses Format jedes mal aufs neue erzeugt werden. Besonders im Sinne der Wartbarkeit keine gute Idee. Falls sich etwas ändert am Objekt oder am Layout, muss diese Änderung überall nachgezogen werden.

Falls die Adresse in eine eigene Klasse ausgelagert ist, wäre natürlich die obige Methode passend. Soll zum Beispiel die Stadt des Mitarbeiters immer als Link zu Bing Maps dargestelt werden, erzeugt man folgende einfache PartialView unter ~\Views\Shared\BingMaps.ascx .

   1: <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Employee>" %>
   2:     <a href="http://www.bing.com/maps/default.aspx?where1=<%= Model.City %>">Anzeigen auf Bing Maps</a>

Aufgerufen wird die PartialView mit

   1: <%= Html.RenderPartial("BingMapsLink", Model); %>

Änderungen können nun an einer Stelle (BingMaps.ascx) durchgeführt werden und die Darstellung ist anwendungsweit konsistent.

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

www.microsoft.com/austria | © 2009 Microsoft Corporation. Alle Rechte vorbehalten.
BlogEngine.NET 2.5.0.6 powered by atwork