Ist Razor oder XSLT besser für mein Projekt? [geschlossen]

9

Ich befinde mich in einem frühen Stadium des Entwurfs eines Systems, das im Wesentlichen in zwei Teile geteilt wird. Ein Teil ist ein Dienst und der andere ist eine Schnittstelle mit dem Dienst, der Daten über OData oder XML bereitstellt. Die Anwendung basiert auf dem MVC-Architekturmuster. Für die Ansichten ziehen wir die Verwendung von XSLT oder Razor unter ASP.NET in Betracht.

XSLT oder Razor würden dazu beitragen, Bedenken zu trennen, bei denen das ursprüngliche XML oder die ursprüngliche Antwort Ihr Modell darstellt, während die XSLT- oder "Razor-Ansicht" Ihre Ansicht darstellt. Ich werde den Controller für dieses Beispiel weglassen. Der ursprüngliche Entwurfsvorschlag empfiehlt XSLT. Ich schlug jedoch die Verwendung von Razor als benutzerfreundlichere Ansichts-Engine vor.

Dies sind die Gründe, die ich für Razor (C #) vorgeschlagen habe:

  • Einfachere Bearbeitung und Erstellung komplizierterer Seiten.
  • Kann leicht Nicht-* ML-Ausgaben erzeugen, z. B. csv, txt, fdf
  • Weniger ausführliche Vorlagen
  • Das Ansichtsmodell ist stark typisiert, wobei XSLT sich auf Konventionen stützen müsste, z. B. Boolesche Werte oder Datumswerte
  • Markup ist zugänglicher, z. B. nbsp, Newline-Normalisierung, Attibute-Value-Normalisierung, Whitespace-Regeln
  • Der integrierte HTML-Helfer kann JS-Validierungscode basierend auf DTO-Attributen generieren
  • Der integrierte HTML-Helfer kann Links zu Aktionen generieren

Und die Argumente für XSLT über Rasiermesser waren:

  • XSLT ist ein Standard und wird noch viele Jahre in der Zukunft existieren.
  • Es ist schwierig, versehentlich Logik in die Ansicht zu verschieben
  • Easer für Nicht-Programmierer (dem ich nicht zustimme).
  • Es war in einigen unserer vergangenen Projekte erfolgreich.
  • Datenwerte sind standardmäßig HTML-codiert
  • Immer gut geformt

Ich suche also nach Argumenten auf beiden Seiten, nach Empfehlungen oder nach Erfahrungen, die eine ähnliche Wahl treffen?

Daniel Little
quelle
9
XSLT hat Leute, die sich 2011 dafür aussprechen?
Wyatt Barnett
6
Wenn jemand XSLT fragt oder ... ist die richtige Antwort, sofort zu unterbrechen, nachdem er ODER mit "dem zweiten" gesagt hat! XSLT wird an vielen Orten unterstützt und ist eine besondere Hölle im Vergleich zu fast jeder anderen Option als Cobol oder Assembler. Verwenden Sie XSLT nur, wenn alle modernen Alternativen entfernt wurden.
Bill

Antworten:

17

Ich habe XSLT erfolgreich als Webpräsentationsstufe verwendet ... im Jahr 1999. In den letzten 12 Jahren sind viel bessere Optionen hinzugekommen. Tun Sie sich selbst einen großen Gefallen und verwenden Sie Razor. Es ist ein Vergnügen.

Afeygin
quelle
Hey - würde es Ihnen etwas ausmachen zu sagen, welche anderen Optionen außer Razor Sie im Sinn haben?
Bartosz
Diese Antwort ist lange her, daher erinnere ich mich nicht ganz daran, was ich vorhatte. Aber auch klassischer ASP würde besser funktionieren als XSLT, IMO. Derzeit sind wir nach Angular gezogen.
Afeygin
20

Hier ist ein grundlegender Syntaxvergleich

Rasierer

@foreach(var item in View.List) {
  <span>@item.Name</span><br/>
}

XSLT

  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="item">
    <xsl:for-each select="name">
      <xsl:value-of select="."/><br/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

Die Datenquellen für die beiden Beispiele

XML

<?xml version="1.0" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<list>
    <item>
        <name>List item one</name>
        <url>http://site.com/one</url>
    </item>
    <item>
        <name>List item two</name>
        <url>http://site.com/two</url>
    </item>
</list>

C #

ViewModel.List = new[] {
    new Link {
        Name = "List item one",
        Url = "http://site.com/one"
    },
    new Link {
        Name = "List item two",
        Url = "http://site.com/two"
    }
};
Daniel Little
quelle
4
Mir ist klar, dass dies tot und vorbei ist, aber ich konnte nicht umhin zu bemerken, dass Ihre eigene Antwort hier das perfekte Argument dafür ist, warum SIE [hoffentlich] mit Razor und nicht mit XSL gegangen sind: Sie fühlen sich mit dem imperativen Programmierparadigma, das Razor verfolgt, eindeutig wohler Im Vergleich zu dem deklarativen (quasi-funktionalen) Modell, in dem XSLT am besten (und am schwierigsten) ist. Beispielsweise haben Sie anstelle des Vorlagenabgleichs name(möglicherweise in einen anderen Modus versetzt) ​​ein For- Each-Modell ausgeführt item. Obwohl dies technisch funktioniert, kann es die Stärken von XSLT nicht ausspielen. Dies sollte nicht als (persönliches) Argument heruntergespielt werden.
Taswyn
4

Gibt es eine 1: 1-Beziehung zwischen HTML-Seiten und XML-Ausgabe? Betrachten Sie folgende Fälle:

  • Starke Korrelation: Jede Webseite hat ein HTML und ein entsprechendes XML-Formular.

Beispiel: Sie hosten eine Website mit Filmkritiken. Sie haben eine Homepage mit den neuesten Bewertungen, eine Seite pro Bewertung und eine Seite mit Kommentaren und Bewertungen der Gäste. Es gibt keinerlei Registrierung. Sie möchten es einfach machen, Ihre Website programmgesteuert zu verwenden, ohne die hässliche HTML-Analyse durchzuführen. In diesem Fall können Sie eine 1: 1-Beziehung haben: Alles, was der Mensch tun kann, kann der Bot auch: Mit denselben Anforderungen erhalten sie denselben Inhalt.

http://example.com/Movie/View/12345/The%20Adjustment%20Bureau wird von Menschen verwendet.
http://example.com/Movie/View/12345/The%20Adjustment%20Bureau?xml wird von Bots verwendet, um auf dieselben Informationen zuzugreifen.

  • Schwache oder keine Korrelation: Es gibt nur eine Reihe von Webdiensten auf der einen Seite und eine Reihe von Webseiten auf der anderen Seite.

Beispiel: Sie sind ein Schöpfer eines anderen Facebook. Es gibt eine Website und eine API. Der einzige gemeinsame Punkt ist, dass dieselbe Datenbank verwendet wird, Bots jedoch nicht auf das zugreifen können, was Personen können, und die Informationen unterschiedlich dargestellt werden.

http://example.com/MyFriends/ zeigt die zehn besten Freunde, die ich in meinem Konto habe. Durch Klicken auf "Mehr" wird eine AJAX-Anfrage gestellt, die andere Freunde anzeigt.
http://api.example.com/friends?user=MainMa&key=1DE051C6F&xml zeigt das entsprechende XML mit allen Freunden, die ich habe.

Sie können sehen, dass:

  • Die API wird separat auf einem bestimmten Server gehostet.
  • Die Beziehung zwischen Seiten und API ist schwer zu erkennen.
  • Die Website muss Sitzungen verwenden, um Anmeldungen zu verfolgen. Die API benötigt nur einen generierten Schlüssel, der bei jeder Anforderung gesendet wird.
  • Die Anzahl der Anfragen ist nicht gleich. In einem Fall müssen Sie die Seite abfragen und dann eine AJAX-Anfrage ausführen, um den Rest Ihrer Freunde zu erhalten. In anderen Fällen erhalten Sie die gesamte Liste auf einmal.
  • Die zurückgegebenen Informationen sind nicht identisch. Als Mensch identifizieren Sie Ihre Freunde anhand ihres Namens. Ein Bot, der die API verwendet, identifiziert sie anhand ihrer eindeutigen Kennung, die Sie möglicherweise nie auf der Website sehen.

Ich empfehle, XSLT nur zu wählen, wenn Sie sich in der Nähe einer 1: 1-Beziehung befinden . In diesem Fall wird der Ansatz vereinfacht: Die Anwendung gibt jedes Mal XML aus, transformiert es jedoch manchmal mit XSLT für die Browser.

Wenn Sie diese Beziehung nicht haben, sehe ich keinen Vorteil von XSLT gegenüber Razor. Es bietet eine Trennung von Bedenken, die auch Razor bietet. Sie können HTML ändern, ohne die Website neu kompilieren zu müssen, was auch Razor zulässt.

Zu den von Ihnen aufgeführten Vorteilen:

XSLT ist ein Standard und wird noch viele Jahre in der Zukunft existieren

Planen Sie eine Bewerbung, die sehr lange Bestand hat? Rasiermesser haben die Chance, in vier Jahren verwendet zu werden oder zumindest unterstützt zu werden. Die Lebensdauer der meisten Anwendungen beträgt weniger als vier Jahre.

Easer für Nicht-Programmierer (etwas, mit dem ich mich herumschlagen könnte).

Warte was?! Selbst Programmierer finden, dass XSLT scheiße ist, schwer zu verstehen und zu verwenden ist. Und wenn ich mit Nicht-Programmierern über XML spreche (nicht einmal in der Nähe von XSLT), weinen sie und rennen weg.

Es war in einigen unserer vergangenen Projekte erfolgreich.

Wenn Ihr Team Razor noch nie zuvor verwendet hat, sollten Sie die Zeit berücksichtigen, die zum Erlernen erforderlich ist.

Wenn Ihr Team es verwendet hat, diese Projekte jedoch fehlgeschlagen sind, sollten Sie analysieren, warum es fehlgeschlagen ist und an Razor lag und was Sie tun können, um solche Fehler in zukünftigen Projekten zu vermeiden.

Arseni Mourzenko
quelle
Ich bin nicht sicher, ob es 1: 1 ist. Einige Seiten verwenden möglicherweise mehrere zusammengeführte XML-Modelle.
Daniel Little
@Lavinski: siehe die Bearbeitung. Ich habe versucht, den Unterschied zwischen 1: 1 und anderen Fällen etwas besser zu erklären. Ich hoffe, es hilft Ihnen zu erkennen, zu welchem ​​Fall Ihr spezifisches Projekt gehört.
Arseni Mourzenko
Warum sagst du, dass Razor 4 Jahre lang verwendet wird? Nebenbei bemerkt denke ich, dass 4 Jahre eine sehr kurze Zeit für eine App-Lebensdauer sind. Wenn ich eine Technologie wählen würde, die 4 Jahre lang unterstützt wird, würde ich nicht einmal die Kurzanleitung lesen: D
Bartosz
3

Meine Empfehlung ist Razor und der Hauptgrund ist, dass es viel einfacher ist, damit zu arbeiten (als mit XSLT, und im Gegensatz zu Ihrem aufgezählten Argument für XSLT sind Sie jedoch auf meiner Seite). Ich habe Erfahrung in der Arbeit mit beiden und Razor wird außerordentlich leistungsfähig bei bedingten Anweisungen, deklarativen Helfern (Funktionen im Prinzip), Verzweigungen, Schleifen usw.

Vergessen wir nicht, dass Razor eine Programmiersprache ist (ja, eine Template-Engine oder View-Engine, die jedoch über eine Programmiersprache wie C # oder VB.NET implementiert ist), während XSLT eher eine Markup-Struktur aufweist.

Ich denke, Ihr Szenario ist wie der Versuch, C # oder T-SQL auszuwählen, um eine komplexe Geschäftsanwendung zu schreiben. Während T-SQL in festgelegten Operationen ziemlich leistungsfähig ist, bricht es einfach ab, wenn Sie versuchen, Logik (if-else, switch, for usw.) darin zu implementieren.

Saeed Neamati
quelle
3

Sie müssen sich nicht entscheiden, Sie können beide verwenden. In ASP.NET MVC können Sie mehrere Ansichtsmodule gleichzeitig verwenden. In dem Projekt, an dem ich gerade arbeite, verwende ich XSLT für schreibgeschützte Ansichten und Razor für Formulare. Sie können auch XSLT mit Rasiermesser-Layout oder Rasiermesser mit XSLT-Layout verwenden. Ich verwende das XSLT-Layout, daher verwende ich einfach ein Razor-Layout, das das XSLT-Layout aufruft und die HTML-Abschnitte als Parameter übergibt:

@{ 
   Html.RenderPartial("~/Views/shared/htmlRaw.xsl", null, new ViewDataDictionary { 
      { "head", RenderSection("head", required: false) },
      { "content", RenderBody().ToString() }
   });
}

... und in htmlRaw.xsldir einfach benutzen disable-output-escaping="yes":

<div id="content">
   <xsl:value-of select="$content" disable-output-escaping="yes"/>
</div>

Siehe Verwenden von Razor und XSLT im selben Projekt .

Max Toro
quelle
0

Ich würde vorschlagen, dass es einen dritten und besseren Weg gibt: Legen Sie zwei verschiedene dünne Frontends auf eine einzelne Service- / Anwendungsschicht, die keine Benutzeroberfläche als solche hat.

Also eher als

UI -> converts to and from xml -> Service -> talks to -> Application Layer -> Model

verwenden

UI -> talks to -> Application Layer -> manipulates -> Model
Service ^

und stellen Sie sicher, dass die Benutzeroberfläche und der Dienst NUR Code enthalten, der für diese Schnittstelle eindeutig ist. (Entschuldigung für die ASCII-Diagramme, das Beste, was ich jetzt tun kann)

Der Grund, warum ich über eines der von Ihnen diskutierten Designs besorgt sein würde, ist, dass es die Entwicklung der Benutzeroberfläche mit der Entwicklung des Dienstes verknüpft, wie Sie es selten tun möchten. Wenn das Unternehmen der Benutzeroberfläche eine Funktionalität hinzufügen möchte, möchten Sie nicht gezwungen werden, diesen Dienst zu schreiben, bevor Sie dies tun können. Sie möchten den Benutzeroberflächenteil schreiben und dann, sofern dies im Dienst erforderlich ist, den Code dort wiederverwenden.

Schlimmer noch, wenn das Unternehmen Daten für den Endbenutzer ganz anders anzeigen möchte als für einen mechanischen Benutzer über den Dienst (was sehr wahrscheinlich ist), müssen Sie damit beginnen, komplexen Code in XSLT oder XSLT einzufügen Erstellen Sie eine zweite Service-Schicht (oder schlimmer noch Fat Controller) über Ihrem Service, um die Präsentation für den Benutzer darzustellen.

Denken Sie in diesem Fall an die Validierung. Sie zeichnen möglicherweise drei Vertrauensstufen. Ihr Modell muss überprüft werden, um sicherzustellen, dass Sie keine ungültigen Daten speichern. In diesem Fall erfordert Ihr Service möglicherweise eine weitere Validierung, um sicherzustellen, dass externe Verbraucher nicht versuchen, etwas zu tun, was sie nicht tun dürfen. und Ihre Benutzeroberfläche benötigt bestenfalls einige Validierungsregeln, damit ein Postback vermieden werden kann.

Und dies ist, bevor wir überhaupt die schwierige Situation von etwas berühren, das nicht über die API zugelassen werden sollte, sondern über die Benutzeroberfläche, für die die API erforderlich ist.

Ich habe ein Argument gehört, dass das Ausführen Ihrer Benutzeroberfläche durch Ihren Dienst Hundefutter ist und daher gut für die Qualität des Dienstes ist, aber ich empfehle nachdrücklich, dass es bessere Möglichkeiten gibt, dies zu tun, während eine solide (und feste) Trennung der Bedenken zwischen dem Dienst beibehalten wird. die Benutzeroberfläche und das Geschäftsmodell.

Wenn Sie Ihren Service mit einer Benutzeroberfläche ausstatten müssen, würde ich Razor dringend gegenüber XSLT empfehlen.

XSLT ist ein Standard, ja. XSLT 2.0 wird jedoch nur eingeschränkt unterstützt, sodass Sie an einem veralteten Standard festhalten, wenn Sie dieses Argument vorbringen möchten.

XSLT ist nicht leicht zu lesen. Von jedem, der kein XSLT-Experte ist. Wer ist Ihrer Meinung nach leichter zu finden, wenn Sie neue Mitarbeiter einstellen müssen? Jemand, der behauptet, ein XSLT-Experte oder ein ASP.NET for MVC-Experte zu sein?

Und ja, ich habe gesehen, dass XSLT erfolgreich verwendet wurde, aber nur bevor MVC für ASP.NET eine Option war.

pdr
quelle
Die Ebenen in der Frage sind nicht wirklich endgültig, sie sind nur ein Hintergrund, der Fokus liegt auf Rasiermesser.
Daniel Little