Sollte der Controller Daten an eine Ansicht im MVC-Muster übergeben?


11

Ich arbeite ziemlich oft mit ASP.NET MVC (und anderen webbasierten MVC-Implementierungen), aber das ist etwas, dessen ich mir nie sicher war: Sollten Controller und Ansicht kommunizieren?

Natürlich sollte der Controller auswählen, welche Ansicht verwendet werden soll, aber was ich meine, sollte der Controller Daten an die Ansicht übergeben? Wenn die Ansicht Daten vom Controller erwartet, sind sie meiner Meinung nach effektiv als Paar (Controller, Ansicht) miteinander verbunden. Stattdessen muss die Ansicht normalerweise mit dem Modell selbst kommunizieren und von jedem Controller unabhängig sein.

Habe ich den richtigen Ansatz oder gibt es keine richtige Antwort? Ändert sich die Antwort bei der Arbeit im Web im Vergleich zu anderen Umgebungen? Ändert sich die Antwort, wenn Sie das Konzept einer stark typisierten Ansicht haben (wie in ASP.NET MVC) oder nicht?


Dafür steht das "M" in "MVC" - das Modell - das die Daten darstellt, die vom Controller an die Ansicht übergeben werden.
Jay Sullivan

Antworten:


7

Die Steuerung bereitet Daten vor, die zum Rendern / Anzeigen weiter an die Ansicht übergeben werden. Es akzeptiert auch Benutzereingabedaten über einen Publish-Subscribe-Mechanismus oder ähnliches. Weitere Informationen zu MVC finden Sie im ersten Diagramm auf Wikipedia oder auf der Website von Martin Fowler .

Wenn die Ansicht Daten vom Controller erwartet, werden sie effektiv als Paar (Controller, Ansicht) miteinander verbunden.

Während eine Ansicht im Allgemeinen Daten akzeptiert, hängt sie in den meisten MVC-Frameworks nicht von bestimmten Controllern ab. Ausnahmen bilden beispielsweise die JavaServer Faces-Familie. Im Allgemeinen können Sie mit Frameworks wie Rails, Django oder Spring MVC Ansichten von Controllern entkoppeln, indem Sie Daten (den Kontext, üblicherweise eine Karte / ein Wörterbuch / eine Tasche) an eine Ansicht übergeben (wobei eine Ansicht eine Implementierung des Vorlagenansichtsmusters ist ).

Ändert sich die Antwort, wenn Sie das Konzept einer stark typisierten Ansicht haben (wie in ASP.NET MVC) oder nicht?

Ob Ihre Programmiersprache stark typisiert ist oder nicht, hat keinen Einfluss darauf, wie Sie Ihre Anwendung organisieren.


Welche Art von Daten wird vorbereitet und weitergegeben? Nehmen Sie ein einfaches Beispiel: Zeigen eines Artikels anhand seiner ID. Ist es die ID, die nach der Überprüfung übergeben wird (sie verweist möglicherweise nicht auf einen Artikel), oder bezieht der Controller den Artikel aus der Datenbank und gibt ihn weiter?
Andy Hunt

Wenn Sie nur die ID übergeben, erledigt Ihre Ansicht nicht mehr Arbeit als das Rendern? Es müsste Daten abrufen, die wahrscheinlich nicht im Sinne des Musters wären.
Rig

1

Die Frage, die Sie stellen, wird von Zeit zu Zeit in meinem Team diskutiert. Wir streiten uns über zwei Ansätze, die beide ihre Vor- und Nachteile haben.

Der erste argumentiert, dass der Controller die Ansicht nach dem folgenden Muster aktualisieren kann. Es hört sowohl GUI- als auch Modellereignisse ab. Wenn ein GUI-Ereignis auftritt, führt es die erforderliche Aktion im Modell aus, die wiederum ausgelöst und ausgelöst wird. Jetzt aktualisiert der Controller normalerweise die Ansicht mit den erforderlichen Daten.

Der zweite Ansatz argumentiert, dass die Ansicht selbst die Modellereignisse abhört und sich selbst mit den Daten aktualisiert, die entweder an das Ereignis angehängt sind oder das Modell abfragen.

Beim ersten Ansatz haben Sie mehr Leistung für den Controller, der wirklich alles steuert, was in Ihrer Anwendung vor sich geht. Die Macht zu entscheiden, auf welche Weise die Ansicht aktualisiert werden soll, je nachdem, welches Ereignis in seinen Händen liegt, und auf diese Weise halten Sie Ihre Ansicht rein. Wie Sie bereits sagten, haben Sie auf diese Weise Ihre Ansicht und Ihren Controller miteinander verbunden.

In der zweiten entkoppeln Sie sie, aber Ihre Ansicht kontrolliert sich tatsächlich auf irgendeine Weise.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.