Wenn MVC "Separation of Concerns" ist, warum wurde dann Razor Syntax eingeführt?


22

Meine Frage bezieht sich auf das von Microsoft eingeführte MVC-Entwurfsmuster und die Rasiermessersyntax.

Während ich das MVC-Entwurfsmuster lernte, wurde mir gesagt, dass die Idee auf einem Prinzip basiert, das als Trennung von Bedenken bekannt ist .

Mit Razor Syntax können wir C # jedoch direkt in Views verwenden .

Ist das nicht ein Schnittpunkt von Bedenken?


7
Erwähnenswert ist, dass ASP.NET MVC das MVC-Entwurfsmuster nicht tatsächlich implementiert. MVC schreibt vor, dass das Modell von der Ansicht auf Änderungen überwacht wird, was in ASP.NET MVC eindeutig nicht der Fall ist.
Benjamin Gruenbaum

11
Es kann auch hilfreich sein, wenn Sie Ihre Meinung zu Ansichten geändert haben. Ansichten sind kein clientseitiger Code. Hierbei handelt es sich um serverseitige Vorlagen, die bei der Verarbeitung clientseitigen HTML-Code generieren. Und als serverseitiger Code ist es durchaus akzeptabel, dass dort C # -Code vorhanden ist.
Eric King

6
@EricKing mit Ausnahme des Teils, in dem Templating-Systeme, die beliebigen Code zulassen, über den Weg des geringsten Widerstands immer zu schlechtem Design, schrecklichen Überlagerungsverletzungen und Nichtwartbarkeit führen. Leider scheint es eine Lektion zu sein, die jede Gemeinde für sich lernen muss.
Hobbs

12
@hobbs Wow, ok. Nach meiner Erfahrung nicht. Sicherlich nicht immer, und (natürlich) ist eine gewisse fachliche Verantwortung seitens des Programmierers erforderlich. Ich beschuldige das Werkzeug nicht.
Eric King

7
@BenjaminGruenbaum Ist nicht wie jedes "MVC" -Framework heutzutage anders, wie sie mit Abhängigkeiten umgehen? Bis zu einem Punkt, an dem es nicht mehr produktiv ist, über The One And Only True MVC-Style zu sprechen, sondern an dem es pragmatischer wäre, den Begriff für ein System zu verwenden, das die Verantwortung in Modellen , Ansichten und Controllern angemessen aufteilt , jedoch sind diese voneinander abhängig?
Alex

Antworten:


66

Sie verbinden die Razor-Syntax mit der Trennung von Bedenken.

Die Trennung von Bedenken hat damit zu tun, wie Sie Ihren Code strukturieren.

Die Möglichkeit, C # in Ansichten zu verwenden, verhindert dies nicht. Es hat nichts mit der Trennung von Anliegen als solchen zu tun.

Natürlich können Sie den Code in Ihrer Ansicht so strukturieren, dass er nicht der Trennung von Bedenken entspricht. Wie steht es jedoch mit C # -Code, der nur zu Anzeigezwecken verwendet wird? Wo würde das leben?


1
Aber C # ist serverseitige Sprache?
John Strowsky

6
@ John - also? Wenn Sie Datumsangaben für die Anzeige formatieren müssen (und Anzeige bedeutet immer Clientseite), wo würden Sie sie formatieren? Das Model? Der Controller? Weder. Sie würden dies in der Ansicht tun.
Oded

16
@John - Ihr Datum wird in der Datenbank gespeichert, Sie geben es über das Modell / den Controller an Ihre Ansicht weiter. Du brauchst dort im HTML, also würdest du es irgendwie nach JS ausgeben, um es zu formatieren, anstatt es direkt mit C # zu formatieren? Warum? Warum ist das besser? Oder eher, wie ist dieser Ansatz eher eine Trennung von Bedenken?
Oded

25
@ NPSF3000 - Eine Sprache ist nicht "serverseitig" oder "clientseitig". Dies ist eine architektonische Trennung - und möglicherweise eine der Sprachimplementierungen (ist JavaScript eine serverseitige oder clientseitige Sprache - denken Sie an node.js).
Oded

14
@FreeAsInBeer - das ist die Art von Logik, die auf der Client-Seite gehört - jemand in Frankreich möchte, dass Datumsangaben (und Währung / Zahlen) anders formatiert werden als jemand in den USA. Der Client "weiß" am besten, wie diese angezeigt werden sollen. Dies ist Präsentationslogik und gehört als solche in die Ansicht.
Oded

35

Anstatt die Frage direkt zu beantworten, hinterfragt meine Antwort die in der Frage getroffene Annahme. Das heißt, die Annahme, dass Razor für MVC entwickelt wurde, ist falsch. Ich arbeite bei Microsoft im ASP.NET-Team und weiß dies aus erster Hand.

Razor startete nicht als View-Engine für MVC. Es wurde für ASP.NET-Webseiten erstellt. Dies ist wahrscheinlich das Maß , das Sie für die am wenigsten voneinander getrennten Bereiche des Spektrums benötigen. Es wurde als moderne Alternative zu ASP.NET Web Forms / Classic ASP und natürlich zu vielen anderen ähnlichen Frameworks für die Serverprogrammierung entwickelt. Die Idee von Razor war es, nahezu nahtlose Übergänge zwischen HTML (Markup) und C # (Code) zu erstellen.

Erst später entschied das Team (zu dem auch ich gehörte), dass die Razor-Syntax für eine View Engine für MVC, die vom selben Team geschrieben wurde, sehr viel Sinn machen würde.

Ob Razor das Konzept der Trennung von Bedenken in ASP.NET MVC ermöglicht, behindert, verbessert oder ändert, ist die Antwort von Oded genau richtig .


2
Ja, stimme ohne Kommentar ab. Ich habe meine Antwort dahingehend geändert, dass klargestellt wird, dass ich die in der ursprünglichen Frage getroffene Annahme in Frage stelle. Aus meiner Sicht ist die Frage nicht direkt zu beantworten, da sie eine ungültige Prämisse hat.
Eilon

Wurden aus Neugier andere Templating-Engines für ASP MVC in Betracht gezogen?
NWard

2
@NWard Zu dieser Zeit gab es eine Reihe von Drittanbieter-View-Engines für ASP.NET MVC, die wir jedoch nicht zu stark in Betracht zogen. Wir waren der Meinung, dass Razor einfacher zu verstehen ist (HTML ist HTML, C # ist C #) und dass es mit dem ASP.NET-Webseitenprojekt auch besser funktioniert.
Eilon

1
@Alex oh, ich kann sicherlich nicht für alle von Razor die Ehre erweisen, aber ich freue mich über Ihren Kommentar!
Eilon

1
@ateri Nach kurzer Zeit ist es die große Zahl oben links in der Antwort.
Mark Hurd

9

Sie verwechseln "Trennung von Technologien" mit "Trennung von Bedenken". Die Grundidee hinter dem "View" -Teil von MVC ist, dass Code in der "View" keinen Datenzugriff oder keine umfangreiche Logik direkt ausführt, sondern den "Model" - und "Controller" -Teilen überlassen bleibt. Der "Controller" transformiert die Daten, führt die erforderliche Logik aus und leitet sie an die richtige "Ansicht" weiter. Die Ansicht kann auch Datentransformationen durchführen, aber ich neige dazu, sie rein kosmetisch zu halten, wie die oben erwähnte Datentransformation.


dies scheint nicht zu bieten alles wesentliche über gemacht Punkte und erklärt in früheren Antworten, vor allem diese eine
gnat

4
+1 Präzise und klar formuliert und mit einem anderen Erklärungsschwerpunkt als frühere Antworten.
Alex

@gnat Ich wollte nur klarstellen, wo seine Verwirrung liegt, und dann schnell erklären, wie das Prinzip der Trennung von Bedenken auf das MVC-Entwurfsmuster zutrifft. Vielleicht hätte ich mehr Zeit darauf verwenden sollen, was "Trennung von Bedenken" bedeutet?
whoisthemachine

0

Ich kann mir ein perfektes Don't do itBeispiel vorstellen .

Nehmen wir an, wir haben einen ProductController:

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.Where(x => x.Discontinued).ToList();
        return new ViewResult(products);
    }
}

Mit Rasierer haben wir eine Alternative

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.ToList();
        return new ViewResult(products);
    }
}

und aus unserer sicht:

@model IEnumerable<Product> 

@foreach (var item in Model.Where(x => x.Discontinued)) {
    ....
}

Ich finde es ziemlich offensichtlich, dass sich die zweite Lösung so falsch anfühlt. Wenn Sie so etwas tun, geben Sie nicht dem Rasiermesser die Schuld - geben Sie sich selbst die Schuld.

Und vergessen Sie nicht: Die Verwendung von C # in Ansichten ist kein Rasiermesser, dies war auch mit ASP.NET-Ansichten möglich. Mit Rasiermesser ist es nur ein bisschen einfacher.

Wenn Sie nach einer Template-Engine suchen, die mehr Rails enthält, als Sie möchten, sollten Sie sich nancy.fx mit der Super-Simple-View-Engine ansehen.

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.