Im Vergleich zu Web Forms ist MVC gleichzeitig ein Ansatz auf niedrigerer Ebene für die HTML-Generierung mit besserer Kontrolle über die Seitenausgabe und ein übergeordneter, architektonisch orientierter Ansatz. Lassen Sie mich Web Forms und MVC erfassen und zeigen, warum ich denke, dass der Vergleich Web Forms in vielen Situationen bevorzugt - solange Sie nicht in einige klassische Web Forms-Fallen geraten.
Web Forms
Im Web Forms-Modell entsprechen Ihre Seiten direkt der Seitenanforderung des Browsers. Wenn Sie einen Benutzer zu einer Liste von Büchern weiterleiten, haben Sie wahrscheinlich eine Seite mit dem Namen "Booklist.aspx", auf die Sie ihn weiterleiten. Auf dieser Seite müssen Sie alles angeben, was zum Anzeigen dieser Liste erforderlich ist. Dies umfasst Code zum Abrufen von Daten, Anwenden einer beliebigen Geschäftslogik und Anzeigen der Ergebnisse. Wenn sich eine Architektur- oder Routing-Logik auf die Seite auswirkt, müssen Sie auch die Architekturlogik auf der Seite codieren. Eine gute Web Forms-Entwicklung umfasst normalerweise die Entwicklung einer Reihe unterstützender Klassen in einer separaten (Unit-testbaren) DLL. Diese Klasse (n) behandeln Geschäftslogik, Datenzugriff und Architektur- / Routingentscheidungen.
MVC
MVC betrachtet die Entwicklung von Webanwendungen eher als "architektonisch": Es bietet ein standardisiertes Gerüst, auf dem aufgebaut werden kann. Es bietet auch Tools zum automatischen Generieren von Modell-, Ansichts- und Controller-Klassen innerhalb der etablierten Architektur. Beispielsweise beginnen Sie sowohl in Ruby on Rails (ab jetzt nur noch "Rails") als auch in ASP.NET MVC immer mit einer Verzeichnisstruktur, die das Gesamtmodell der Webanwendungsarchitektur widerspiegelt. Um eine Ansicht, ein Modell und einen Controller hinzuzufügen, verwenden Sie einen Befehl wie Rails "Rails-Skript / Gerüst generieren {Modellname}" (ASP.NET MVC bietet ähnliche Befehle in der IDE). In der resultierenden Controller-Klasse gibt es Methoden ("Aktionen") für Index (Liste anzeigen), Anzeigen, Neu und Bearbeiten und Zerstören (zumindest in Rails ist MVC ähnlich). Standardmäßig sind diese "
Das Layout von Verzeichnissen und Dateien ist in MVC von Bedeutung. In ASP.NET MVC hat die Indexmethode für ein "Buch" -Objekt wahrscheinlich nur eine Zeile: "Return View ();" Durch die Magie von MVC wird das Buchmodell an die Seite "/View/Books/Index.aspx" gesendet, auf der Sie Code zum Anzeigen von Büchern finden. Rails Ansatz ist ähnlich, obwohl die Logik etwas expliziter und weniger "magisch" ist. Eine Ansichtsseite in einer MVC-App ist normalerweise einfacher als eine Web Forms-Seite, da sie sich nicht so sehr um Routing, Geschäftslogik oder Datenverarbeitung kümmern müssen.
Vergleich
Die Vorteile von MVC liegen in einer sauberen Trennung von Bedenken und einem saubereren, HTML / CSS / AJAX / Javascript-zentrierten Modell für die Erstellung Ihrer Ausgabe. Dies verbessert die Testbarkeit, bietet ein standardisierteres Design und öffnet die Tür zu einer Website vom Typ "Web 2.0".
Es gibt jedoch auch einige signifikante Nachteile.
Erstens, während es einfach ist, eine Demo-Site in Betrieb zu nehmen, weist das gesamte Architekturmodell eine signifikante Lernkurve auf. Wenn sie "Konvention über Konfiguration" sagen, klingt das gut - bis Sie feststellen, dass Sie eine Konvention im Wert von einem Buch lernen müssen. Darüber hinaus ist es oft ein wenig aufreizend , um herauszufinden , was los ist, weil Sie sind auf Magie anstatt explizite Anrufe zu verlassen. Zum Beispiel, dass "Return View ();" oben anrufen? Der exakt gleiche Aufruf kann in anderen Aktionen gefunden werden, aber sie gehen an verschiedene Orte. Wenn Sie die MVC-Konvention verstehendann wissen Sie, warum dies getan wird. Es ist jedoch sicherlich kein Beispiel für eine gute Benennung oder leicht verständlichen Code, und es ist für neue Entwickler viel schwieriger zu erlernen als Web Forms (dies ist nicht nur eine Meinung: Ich hatte letztes Jahr einen Sommerpraktikanten, der Web Forms lernte und MVC in diesem Jahr und die Unterschiede in der Produktivität waren ausgeprägt - zugunsten von Web Forms). Übrigens ist Rails in dieser Hinsicht etwas besser, obwohl Ruby on Rails dynamisch benannte Methoden bietet, an die man sich auch ernsthaft gewöhnen muss.
Zweitens geht MVC implizit davon aus, dass Sie eine klassische Website im CRUD-Stil erstellen. Die Architekturentscheidungen und insbesondere die Codegeneratoren sind alle darauf ausgelegt, diese Art von Webanwendung zu unterstützen. Wenn Sie eine CRUD-Anwendung erstellen und eine bewährte Architektur übernehmen möchten (oder Architekturdesign einfach nicht mögen), sollten Sie wahrscheinlich MVC in Betracht ziehen. Wenn Sie jedoch mehr als CRUD ausführen und / oder mit der Architektur einigermaßen kompetent sind, fühlt sich MVC möglicherweise wie eine Zwangsjacke an, bis Sie das zugrunde liegende Routing-Modell wirklich beherrschen (das erheblich komplexer ist als das einfache Routing in einer WebForms-App). Selbst dann hatte ich das Gefühl, immer gegen das Modell zu kämpfen und mir Sorgen um unerwartete Ergebnisse zu machen.
Drittens, wenn Sie sich nicht für Linq interessieren (entweder weil Sie befürchten, dass Linq-to-SQL verschwinden wird, oder weil Sie Linq-to-Entities lächerlich überproduziert und unterversorgt finden), dann wollen Sie es auch nicht Diesen Weg zu gehen, da ASP.NET MVC-Gerüstwerkzeuge um Linq herum gebaut wurden (dies war der Killer für mich). Das Datenmodell von Rails ist auch ziemlich umständlich im Vergleich zu dem, was Sie erreichen können, wenn Sie Erfahrung mit SQL haben (und insbesondere, wenn Sie mit TSQL und gespeicherten Prozeduren vertraut sind!).
Viertens weisen MVC-Befürworter häufig darauf hin, dass MVC-Ansichten dem HTML / CSS / AJAX-Modell des Webs näher kommen. Zum Beispiel sind "HTML-Helfer" - die kleinen Code-Aufrufe auf Ihrer vew-Seite, die Inhalte austauschen und in HTML-Steuerelemente einfügen - viel einfacher in Javascript zu integrieren als Web Forms-Steuerelemente. ASP.NET 4.0 bietet jedoch die Möglichkeit, Ihre Steuerelemente zu benennen, und beseitigt diesen Vorteil weitgehend.
Fünftens verspotten MVC-Puristen häufig Viewstate. In einigen Fällen haben sie Recht. Viewstate kann jedoch auch ein großartiges Werkzeug und ein Segen für die Produktivität sein. Zum Vergleich: Die Handhabung von Viewstate ist viel einfacher als der Versuch , Websteuerelemente von Drittanbietern in eine MVC-App zu integrieren. Während der Steuerung Integration für MVC bekommen kann einfacher, alle aktuellen Bemühungen , dass ich leidet unter der Notwendigkeit zu bauen gesehen habe (etwas grody) Code , der diese Kontrollen wieder auf die Ansicht der Controller - Klasse zu verknüpfen (das ist - zu Arbeit um das MVC - Modell ).
Schlussfolgerungen
Ich mag die MVC-Entwicklung in vielerlei Hinsicht (obwohl ich Rails bei weitem gegenüber ASP.NET MVC bevorzuge). Ich denke auch, dass es wichtig ist, dass wir nicht in die Falle tappen, dass ASP.NET MVC ein "Anti-Pattern" von ASP.NET Web Forms ist. Sie sind unterschiedlich, aber nicht völlig fremd und sicherlich gibt es Platz für beide.
Ich bevorzuge jedoch die Entwicklung von Web Forms, da es für die meisten Aufgaben einfach einfacher ist, Dinge zu erledigen (mit Ausnahme der Erstellung einer Reihe von CRUD-Formularen). MVC scheint in gewissem Maße auch unter einem Übermaß an Theorie zu leiden . Schauen Sie sich in der Tat die vielen Fragen an, die hier auf SO von Personen gestellt werden, die seitenorientiertes ASP.NET kennen, aber MVC ausprobieren. Ausnahmslos knirschen die Zähne, da Entwickler feststellen, dass sie keine grundlegenden Aufgaben erledigen können, ohne durch Reifen zu springen oder eine große Lernkurve zu überstehen. Dies ist es, was Web Forms in meinem Buch MVC überlegen macht: Mit MVC zahlen Sie einen realen Preis , um ein bisschen mehr Testbarkeit zu erlangen oder, noch schlimmer, einfach als cool angesehen zu werden, weil Sie das verwendenneueste Technik.
Update: Ich wurde im Kommentarbereich heftig kritisiert - einige davon sind ziemlich fair. Daher habe ich mehrere Monate damit verbracht, Rails und ASP.NET MVC zu lernen, um sicherzugehen, dass ich das nächste große Ding nicht wirklich verpasst habe! Natürlich trägt es auch dazu bei, dass ich eine ausgewogene und angemessene Antwort auf die Frage gebe. Sie sollten wissen, dass die obige Antwort eine wichtige Neufassung meiner ursprünglichen Antwort ist, falls die Kommentare nicht synchron zu sein scheinen.
Während ich mir MVC genauer ansah, dachte ich für eine Weile, dass ich am Ende einen großen Mea Culpa haben würde. Am Ende kam ich zu dem Schluss, dass MVC den Anruf für mich nicht wirklich beantwortet, obwohl ich denke, dass wir viel mehr Energie für die Architektur und Testbarkeit von Web Forms aufwenden müssen. Also ein herzliches Dankeschön an die Leute, die meine erste Antwort intelligent kritisiert haben.
Was diejenigen betrifft , die dies als religiösen Kampf betrachteten und unermüdlich Abstimmungsfluten verursachten, verstehe ich nicht, warum Sie sich die Mühe machen (mehr als 20 Abstimmungen innerhalb von Sekunden bei mehreren Gelegenheiten sind sicherlich nicht normal). Wenn Sie diese Antwort lesen und sich fragen, ob meine Antwort wirklich "falsch" ist, da die Punktzahl weitaus niedriger ist als einige der anderen Antworten, können Sie sicher sein, dass sie mehr über einige Leute aussagt, die anderer Meinung sind als der allgemeine Sinn von die Community (insgesamt wurde diese weit über 100 Mal positiv bewertet).
Tatsache ist, dass sich viele Entwickler nicht für MVC interessieren und dies in der Tat keine Minderheitensicht ist (selbst innerhalb von MS, wie die Blogs zu zeigen scheinen).