Vergleich der ASP.NET MVC View Engine

339

Ich habe bei SO & Google nach einer Aufschlüsselung der verschiedenen für ASP.NET MVC verfügbaren View Engines gesucht, aber nicht viel mehr als einfache allgemeine Beschreibungen der Ansicht einer View Engine gefunden.

Ich suche nicht unbedingt nach "besten" oder "schnellsten", sondern nach realen Vergleichen der Vor- und Nachteile der Hauptakteure (z. B. der Standard-WebFormViewEngine, der MvcContrib View Engines usw.) für verschiedene Situationen. Ich denke, dies wäre sehr hilfreich, um festzustellen, ob ein Wechsel von der Standard-Engine für ein bestimmtes Projekt oder eine bestimmte Entwicklungsgruppe von Vorteil ist.

Hat jemand einen solchen Vergleich erlebt?

mckamey
quelle
43
Die Ironie, dass es "nicht konstruktiv" ist, hat den Beteiligten, die es fast 45.000 Mal angesehen haben, viel Wert gebracht. Schade, dass SO trotz der Bedürfnisse der Community den eigenen Nutzen einschränkt. Ich bezweifle, dass @ jeff-atwood sich so fühlen würde.
McKamey

Antworten:

430

ASP.NET MVC View Engines (Community-Wiki)

Da eine umfassende Liste nicht zu existieren scheint, beginnen wir eine hier auf SO. Dies kann für die ASP.NET MVC-Community von großem Wert sein, wenn Personen ihre Erfahrungen hinzufügen (insbesondere alle, die zu einer dieser Erfahrungen beigetragen haben). Alles, was implementiert wird IViewEngine(z. B. VirtualPathProviderViewEngine), ist hier faires Spiel. Alphabetisieren Sie einfach neue View Engines (lassen Sie WebFormViewEngine und Razor oben) und versuchen Sie, bei Vergleichen objektiv zu sein.


System.Web.Mvc.WebFormViewEngine

Designziele:

Eine Ansichts-Engine, mit der eine Web Forms-Seite auf die Antwort gerendert wird.

Vorteile:

  • allgegenwärtig, da es mit ASP.NET MVC geliefert wird
  • vertraute Erfahrung für ASP.NET-Entwickler
  • IntelliSense
  • kann mit einem CodeDom-Anbieter eine beliebige Sprache auswählen (z. B. C #, VB.NET, F #, Boo, Nemerle)
  • On-Demand-Kompilierung oder vorkompilierte Ansichten

Nachteile:

  • Die Verwendung wird durch das Vorhandensein von "klassischen ASP.NET" -Mustern verwirrt, die in MVC nicht mehr gelten (z. B. ViewState PostBack).
  • kann zum Anti-Muster von "Tag-Suppe" beitragen
  • Codeblock-Syntax und starke Typisierung können im Weg stehen
  • IntelliSense erzwingt einen Stil, der für Inline-Codeblöcke nicht immer geeignet ist
  • kann beim Entwerfen einfacher Vorlagen verrauscht sein

Beispiel:

<%@ Control Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %>
<% if(model.Any()) { %>
<ul>
    <% foreach(var p in model){%>
    <li><%=p.Name%></li>
    <%}%>
</ul>
<%}else{%>
    <p>No products available</p>
<%}%>

System.Web.Razor

Designziele:

Vorteile:

  • Kompakt, ausdrucksstark und flüssig
  • Leicht zu lernen
  • Ist keine neue Sprache
  • Hat große Intellisense
  • Gerät testbar
  • Allgegenwärtig, wird mit ASP.NET MVC geliefert

Nachteile:

  • Erzeugt ein etwas anderes Problem als die oben genannte "Tag-Suppe". Wo die Server-Tags tatsächlich eine Struktur um Server- und Nicht-Server-Code bieten, verwechselt Razor HTML- und Server-Code, was die reine HTML- oder JS-Entwicklung schwierig macht (siehe Beispiel 1), da Sie am Ende HTML und / oder JavaScript "entkommen" müssen Tags unter bestimmten sehr häufigen Bedingungen.
  • Schlechte Kapselung + Wiederverwendbarkeit: Es ist unpraktisch, eine Rasiervorlage wie eine normale Methode aufzurufen. In der Praxis kann Rasierer Code aufrufen, aber nicht umgekehrt, was das Mischen von Code und Präsentation fördern kann.
  • Die Syntax ist sehr HTML-orientiert. Das Generieren von Nicht-HTML-Inhalten kann schwierig sein. Trotzdem ist das Datenmodell von razor im Wesentlichen nur eine Verkettung von Zeichenfolgen, sodass Syntax- und Verschachtelungsfehler weder statisch noch dynamisch erkannt werden, obwohl die VS.NET-Entwurfszeit dazu beiträgt, dies etwas zu mildern. Wartbarkeit und Refactorability können darunter leiden.
  • Keine dokumentierte API , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Con Beispiel # 1 (beachten Sie die Platzierung von "string [] ..."):

@{
    <h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
    foreach (var person in teamMembers)
    {
        <p>@person</p>
    }
}

Bellevue

Designziele:

  • Respektieren Sie HTML als erstklassige Sprache, anstatt es als "nur Text" zu behandeln.
  • Leg dich nicht mit meinem HTML an! Der Datenbindungscode (Bellevue-Code) sollte von HTML getrennt sein.
  • Erzwingen Sie eine strikte Trennung zwischen Modell und Ansicht

Brail

Designziele:

Die Brail-Ansichts-Engine wurde von MonoRail portiert, um mit Microsoft ASP.NET MVC Framework zu arbeiten. Eine Einführung in Brail finden Sie in der Dokumentation auf der Website des Castle-Projekts .

Vorteile:

  • modelliert nach "handgelenksfreundlicher Python-Syntax"
  • On-Demand-kompilierte Ansichten (aber keine Vorkompilierung verfügbar)

Nachteile:

Beispiel:

<html>    
<head>        
<title>${title}</title>
</head>    
<body>        
     <p>The following items are in the list:</p>  
     <ul><%for element in list:    output "<li>${element}</li>"%></ul>
     <p>I hope that you would like Brail</p>    
</body>
</html>

Hasic

Hasic verwendet die XML-Literale von VB.NET anstelle von Zeichenfolgen wie die meisten anderen View Engines.

Vorteile:

  • Überprüfung der Kompilierungszeit von gültigem XML
  • Syntaxfärbung
  • Volle Intelligenz
  • Kompilierte Ansichten
  • Erweiterbarkeit mit regulären CLR-Klassen, -Funktionen usw.
  • Nahtlose Kompositionsfähigkeit und Manipulation, da es sich um regulären VB.NET-Code handelt
  • Gerät testbar

Nachteile:

  • Leistung: Erstellt das gesamte DOM, bevor es an den Client gesendet wird.

Beispiel:

Protected Overrides Function Body() As XElement
    Return _
    <body>
        <h1>Hello, World</h1>
    </body>
End Function

NDjango

Designziele:

NDjango ist eine Implementierung der Django-Vorlagensprache auf der .NET-Plattform unter Verwendung der F # -Sprache .

Vorteile:


NHaml

Designziele:

.NET-Port der Rails Haml-Ansichts-Engine. Von der Haml-Website :

Haml ist eine Auszeichnungssprache, mit der das XHTML eines Webdokuments ohne Verwendung von Inline-Code sauber und einfach beschrieben wird. Haml vermeidet die Notwendigkeit, XHTML explizit in die Vorlage zu codieren, da es sich tatsächlich um eine abstrakte Beschreibung des XHTML handelt mit etwas Code zum Generieren von dynamischem Inhalt.

Vorteile:

  • knappe Struktur (dh trocken)
  • gut eingerückt
  • klare Struktur
  • C # Intellisense (für VS2008 ohne ReSharper)

Nachteile:

  • eine Abstraktion von XHTML, anstatt die Vertrautheit des Markups zu nutzen
  • Kein Intellisense für VS2010

Beispiel:

@type=IEnumerable<Product>
- if(model.Any())
  %ul
    - foreach (var p in model)
      %li= p.Name
- else
  %p No products available

NVelocityViewEngine (MvcContrib)

Designziele:

Eine View-Engine basierend auf NVelocity , einem .NET-Port des beliebten Java-Projekts Velocity .

Vorteile:

  • leicht zu lesen / schreiben
  • prägnanter Ansichtscode

Nachteile:

  • begrenzte Anzahl von Hilfsmethoden in der Ansicht verfügbar
  • verfügt nicht automatisch über eine Visual Studio-Integration (IntelliSense, Überprüfung von Ansichten zur Kompilierungszeit oder Refactoring)

Beispiel:

#foreach ($p in $viewdata.Model)
#beforeall
    <ul>
#each
    <li>$p.Name</li>
#afterall
    </ul>
#nodata 
    <p>No products available</p>
#end

SharpTiles

Designziele:

SharpTiles ist ein Teilport von JSTL, kombiniert mit dem Konzept hinter dem Tiles-Framework (ab Mile Stone 1).

Vorteile:

  • Java-Entwicklern bekannt
  • Codeblöcke im XML-Stil

Nachteile:

  • ...

Beispiel:

<c:if test="${not fn:empty(Page.Tiles)}">
  <p class="note">
    <fmt:message key="page.tilesSupport"/>
  </p>
</c:if>

Spark View Engine

Designziele:

Die Idee ist, dass das HTML den Ablauf dominiert und der Code nahtlos passt.

Vorteile:

  • Erzeugt besser lesbare Vorlagen
  • C # Intellisense (für VS2008 ohne ReSharper)
  • SparkSense-Plug-In für VS2010 (funktioniert mit ReSharper)
  • Bietet eine leistungsstarke Bindungsfunktion , mit der Sie den gesamten Code in Ihren Ansichten entfernen und auf einfache Weise Ihre eigenen HTML-Tags erfinden können

Nachteile:

  • Keine klare Trennung der Vorlagenlogik vom Literal-Markup (dies kann durch Namespace-Präfixe verringert werden).

Beispiel:

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
    <li each="var p in products">${p.Name}</li>
</ul>
<else>
    <p>No products available</p>
</else>

<Form style="background-color:olive;">
    <Label For="username" />
    <TextBox For="username" />
    <ValidationMessage For="username" Message="Please type a valid username." />
</Form>

StringTemplate View Engine MVC

Designziele:

  • Leicht. Es werden keine Seitenklassen erstellt.
  • Schnell. Vorlagen werden in den Antwortausgabestream geschrieben.
  • Zwischengespeichert. Vorlagen werden zwischengespeichert, verwenden jedoch einen FileSystemWatcher, um Dateiänderungen zu erkennen.
  • Dynamisch. Vorlagen können im laufenden Betrieb im Code generiert werden.
  • Flexibel. Vorlagen können auf jeder Ebene verschachtelt werden.
  • In Übereinstimmung mit den MVC-Prinzipien. Fördert die Trennung von Benutzeroberfläche und Geschäftslogik. Alle Daten werden vorab erstellt und an die Vorlage weitergegeben.

Vorteile:

  • StringTemplate Java-Entwicklern vertraut

Nachteile:

  • Eine vereinfachte Vorlagensyntax kann die beabsichtigte Ausgabe beeinträchtigen (z. B. jQuery-Konflikt ).

Wing Beats

Wing Beats ist ein internes DSL zum Erstellen von XHTML. Es basiert auf F # und enthält eine ASP.NET MVC-Ansichts-Engine, kann jedoch auch ausschließlich für die Erstellung von XHTML verwendet werden.

Vorteile:

  • Überprüfung der Kompilierungszeit von gültigem XML
  • Syntaxfärbung
  • Volle Intelligenz
  • Kompilierte Ansichten
  • Erweiterbarkeit mit regulären CLR-Klassen, -Funktionen usw.
  • Nahtlose Kompositionsfähigkeit und Manipulation, da es sich um regulären F # -Code handelt
  • Gerät testbar

Nachteile:

  • Sie schreiben nicht wirklich HTML, sondern Code, der HTML in einem DSL darstellt.

XsltViewEngine (MvcContrib)

Designziele:

Erstellt Ansichten aus vertrauten XSLT

Vorteile:

  • weit verbreitet
  • vertraute Vorlagensprache für XML-Entwickler
  • XML-basiert
  • erprobt
  • Syntax- und Elementverschachtelungsfehler können statisch erkannt werden.

Nachteile:

  • Der funktionale Sprachstil erschwert die Flusskontrolle
  • XSLT 2.0 wird (wahrscheinlich?) Nicht unterstützt. (XSLT 1.0 ist viel weniger praktisch).

mckamey
quelle
9
@ BrianLy: weil F # kompiliert und funktionsfähig ist, was bedeutet, dass es schnell, interoperabler mit dem Rest der Laufzeit (zumindest bis c # 4) und idempotent ist. Wir gingen zuerst die Ironpython-Route entlang, waren aber mit den Ergebnissen nicht zufrieden. Was die Benennung
angeht
7
Down Voting wegen der Cons-Sektion von Brail. Boo als Sprache zu haben, ist sicherlich kein Nachteil.
Owen
48
@ Owen: Ja, das ist es. Sie müssen dies aus der Perspektive eines C # -Entwicklers betrachten. Sie möchten keine weitere Sprache lernen, nur um eine Template-Engine zu verwenden. (Natürlich, wenn Sie Boo bereits kennen, ist das cool, aber für die Mehrheit der C # -Entwickler ist dies eine zusätzliche Hürde, die es zu überwinden gilt)
Christian Klauser
5
Rasiermesser ist da drin. Es sollte aktualisiert werden, um Razor zu alphabetisieren.
McKamey
3
Boo ist ein Profi, kein Con. Sie befinden sich bereits "außerhalb" von C #. Je kürzer die Vorlage sein kann, desto besser. C # sollte nicht in einem "Vorlagen" -Kontext verwendet werden, es ist etwas ausdrucksstark, aber nicht "handgelenksfreundlich". Auf der anderen Seite wurde BOO in diesem Sinne entwickelt und eignet sich daher viel besser für die Verwendung in einem Vorlagenkontext.
Loudenvier
17

Meine aktuelle Wahl ist Rasiermesser. Es ist sehr sauber und leicht zu lesen und hält die Ansichtsseiten sehr einfach zu pflegen. Es gibt auch Intellisense-Unterstützung, die wirklich großartig ist. ALos, wenn es mit Web-Helfern verwendet wird, ist es auch wirklich mächtig.

Um ein einfaches Beispiel bereitzustellen:

@Model namespace.model
<!Doctype html>
<html>
<head>
<title>Test Razor</title>
</head>
<body>
<ul class="mainList">
@foreach(var x in ViewData.model)
{
<li>@x.PropertyName</li>
}
</ul>
</body>

Und da hast du es. Das ist sehr sauber und leicht zu lesen. Zugegeben, das ist ein einfaches Beispiel, aber selbst auf komplexen Seiten und Formularen ist es immer noch sehr leicht zu lesen und zu verstehen.

Was die Nachteile angeht? Nun, bis jetzt (ich bin neu in diesem Bereich) fehlt es bei der Verwendung einiger Helfer für Formulare an Unterstützung für das Hinzufügen einer CSS-Klassenreferenz, was etwas ärgerlich ist.

Danke Nathj07

nathj07
quelle
1
Doh! Ich habe gerade bemerkt, wie alt diese Diskussion ist. Na ja, vielleicht wird es jemand finden und es wird sich immer noch als nützlich erweisen.
nathj07
10

Ich weiß, dass dies Ihre Frage nicht wirklich beantwortet, aber verschiedene View Engines haben unterschiedliche Zwecke. Die Spark View Engine zum Beispiel zielt darauf ab, Ihre Ansichten von "Tag Suppe" zu befreien, indem versucht wird, alles flüssig und lesbar zu machen.

Am besten schauen Sie sich nur einige Implementierungen an. Wenn es für die Absicht Ihrer Lösung attraktiv erscheint, probieren Sie es aus. Sie können View-Engines in MVC mischen und anpassen, sodass es kein Problem sein sollte, wenn Sie sich nicht für eine bestimmte Engine entscheiden.

MunkiPhD
quelle
Danke für die Antwort. Ich habe buchstäblich damit begonnen, was Sie vorgeschlagen haben, als ich dachte, "jemand muss bereits eine Zusammenfassung gemacht haben". Ich hoffe auf eine Zusammenfassung dieser Art von Designzielen und -mängeln. "Die Spark View Engine ... zielt darauf ab, Ihre Ansichten von" Tag Suppe "zu befreien, indem versucht wird, alles flüssig und lesbar zu machen." Dies impliziert einen Grund für die Erstellung sowie einen Mangel der Standardansichts-Engine. Noch eine Kugel in der Liste.
McKamey
7

Überprüfen Sie dieses SharpDOM . Dies ist ac # 4.0 interne dsl zum Generieren von HTML und auch asp.net mvc view engine.

Anton Shelin
quelle
Klingt nach der einzig vernünftigen Möglichkeit, Ansichten zu erstellen.
Stephan Eggermont
Kannst du es der allgemeinen Wiki-Antwort hinzufügen?
Mauricio Scheffer
Ich kann es nicht mehr bei CodePlex oder Google finden. Wo ist es hin?? (Es ist immer noch auf Codeproject: codeproject.com/Articles/667581/… )
Jared Thirsk
5

Ich mag ndjango . Es ist sehr einfach zu bedienen und sehr flexibel. Sie können die Ansichtsfunktion einfach mit benutzerdefinierten Tags und Filtern erweitern. Ich denke, dass "stark an F # gebunden" eher ein Vorteil als ein Nachteil ist.

rdovhan
quelle
4

Ich denke, diese Liste sollte auch Beispiele für jede Ansichts-Engine enthalten, damit Benutzer einen Eindruck von jeder bekommen können, ohne jede Website besuchen zu müssen.

Bilder sagen mehr als tausend Worte und Markup-Beispiele sind wie Screenshots für View Engines :) Also hier ist einer von meiner Lieblings- Spark View Engine

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
  <li each="var p in products">${p.Name}</li>
</ul>
<else>
  <p>No products available</p>
</else>
Mythos
quelle
4
sieht zu sehr nach Coldfusion aus. Ich bin kein großer Fan davon, Code in ein solches Markup zu mischen. Es wird schwierig zu pflegen.
Agile Jedi