Confronto del motore di visualizzazione ASP.NET MVC
-
12-09-2019 - |
Domanda
Ho cercato su SO e Google un'analisi dei vari motori di visualizzazione disponibili per ASP.NET MVC, ma non ho trovato molto più che semplici descrizioni di alto livello di cosa sia un motore di visualizzazione.
Non sto necessariamente cercando il "migliore" o il "più veloce", ma piuttosto alcuni confronti reali dei vantaggi/svantaggi dei principali attori (ad es.il WebFormViewEngine predefinito, i motori di visualizzazione MvcContrib, ecc.) per varie situazioni.Penso che questo sarebbe davvero utile per determinare se il passaggio dal motore predefinito sarebbe vantaggioso per un determinato progetto o gruppo di sviluppo.
Qualcuno ha riscontrato un simile confronto?
Soluzione
Motori di visualizzazione ASP.NET MVC (Wiki della community)
Poiché non sembra esistere un elenco completo, iniziamone uno qui su SO.Questo può essere di grande valore per la comunità ASP.NET MVC se le persone aggiungono la loro esperienza (esp.chiunque abbia contribuito a uno di questi).Qualunque cosa implementata IViewEngine
(per esempio. VirtualPathProviderViewEngine
) è un gioco leale qui.Basta mettere in ordine alfabetico i nuovi motori di visualizzazione (lasciando WebFormViewEngine e Razor in alto) e cercare di essere obiettivi nei confronti.
System.Web.Mvc.WebFormViewEngine
Obiettivi di progettazione:
Un motore di visualizzazione che viene utilizzato per rendere una pagina di forma Web forma alla risposta.
Professionisti:
- onnipresente poiché viene fornito con ASP.NET MVC
- esperienza familiare per gli sviluppatori ASP.NET
- IntelliSense
- può scegliere qualsiasi lingua con un provider CodeDom (ad es.C#, VB.NET, F#, Boo, Nemerle)
- compilazione su richiesta o precompilato visualizzazioni
Contro:
- l'utilizzo è confuso dall'esistenza di modelli "ASP.NET classici" che non si applicano più in MVC (ad es.Visualizza stato PostBack)
- può contribuire all'anti-modello della "zuppa di tag"
- la sintassi del blocco di codice e la tipizzazione forte possono intralciarsi
- IntelliSense applica uno stile non sempre appropriato per i blocchi di codice inline
- può essere rumoroso durante la progettazione di modelli semplici
Esempio:
<%@ 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>
<%}%>
Obiettivi di progettazione:
Professionisti:
- Compatto, espressivo e fluido
- Facile da imparare
- Non è una nuova lingua
- Ha un ottimo Intellisense
- Unità testabile
- Ubiquito, fornito con ASP.NET MVC
Contro:
- Crea un problema leggermente diverso dalla "zuppa di tag" menzionata sopra.Laddove i tag server forniscono effettivamente una struttura attorno al codice server e non server, Razor confonde codice HTML e codice server, rendendo difficile lo sviluppo puro di HTML o JS (vedere l'esempio n. 1) poiché si finisce per dover "sfuggire" a HTML e/o JavaScript tag in determinate condizioni molto comuni.
- Scarso incapsulamento+riutilizzabilità:Non è pratico chiamare un modello di rasoio come se fosse un metodo normale: in pratica il rasoio può chiamare il codice ma non viceversa, il che può incoraggiare la combinazione di codice e presentazione.
- La sintassi è molto orientata all'HTML;generare contenuto non HTML può essere complicato.Nonostante ciò, il modello di dati di Razor è essenzialmente solo una concatenazione di stringhe, quindi gli errori di sintassi e di annidamento non vengono rilevati né staticamente né dinamicamente, sebbene l'aiuto in fase di progettazione VS.NET riduca in qualche modo questo problema.La manutenibilità e la rifattorizzazione possono risentirne.
Nessuna API documentata, http://msdn.microsoft.com/en-us/library/system.web.razor.aspx
Contro Esempio n. 1 (notare la posizione di "string[]..."):
@{
<h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
foreach (var person in teamMembers)
{
<p>@person</p>
}
}
Obiettivi di progettazione:
- Rispetta l'HTML come linguaggio di prima classe invece di trattarlo come "solo testo".
- Non scherzare con il mio HTML!Il codice di associazione dati (codice Bellevue) deve essere separato dall'HTML.
- Applica una rigorosa separazione modello-vista
Obiettivi di progettazione:
Il motore Brail View è stato portato dalla monorotaia per lavorare con Microsoft ASP.NET MVC Framework.Per un'introduzione a Brail, consultare la documentazione sul Sito web del progetto Castle.
Professionisti:
- modellato sulla "sintassi Python adatta al polso"
- Viste compilate su richiesta (ma nessuna precompilazione disponibile)
Contro:
- progettato per essere scritto nella lingua Boh
Esempio:
<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 utilizza i valori letterali XML di VB.NET invece delle stringhe come la maggior parte degli altri motori di visualizzazione.
Professionisti:
- Controllo in fase di compilazione di XML valido
- Colorazione della sintassi
- Intellisenso completo
- Viste compilate
- Estendibilità utilizzando classi, funzioni, ecc. CLR regolari
- Componibilità e manipolazione senza soluzione di continuità poiché si tratta di un normale codice VB.NET
- Unità testabile
Contro:
- Prestazione:Costruisce l'intero DOM prima di inviarlo al client.
Esempio:
Protected Overrides Function Body() As XElement
Return _
<body>
<h1>Hello, World</h1>
</body>
End Function
Obiettivi di progettazione:
NDjango è un'implementazione di Linguaggio dei modelli Django Sulla piattaforma .NET, utilizzando il Linguaggio F#.
Professionisti:
- La versione 0.9.1.0 di NDjango sembra essere più stabile sotto stress rispetto alla versione 0.9.1.0
WebFormViewEngine
- Editor di modelli Django con colorazione della sintassi, completamento del codice e diagnostica durante la digitazione (solo VS2010)
- Integrato con i framework ASP.NET, Castle MonoRail e Bistro MVC
Obiettivi di progettazione:
Port .NET del motore di visualizzazione Rails Haml.Da il sito web di Haml:
Haml è un linguaggio di markup che viene utilizzato per descrivere in modo pulito e semplicemente descrivere l'XHTML di qualsiasi documento Web, senza l'uso del codice in linea ...Haml evita la necessità di codificare esplicitamente XHTML nel modello, perché in realtà è una descrizione astratta di XHTML, con un po 'di codice per generare contenuti dinamici.
Professionisti:
- struttura concisa (es.ASCIUTTO.)
- ben frastagliato
- struttura chiara
- IntelliSense C# (per VS2008 senza ReSharper)
Contro:
- un'astrazione da XHTML piuttosto che sfruttare la familiarità del markup
- Nessun Intellisense per VS2010
Esempio:
@type=IEnumerable<Product>
- if(model.Any())
%ul
- foreach (var p in model)
%li= p.Name
- else
%p No products available
NVelocityViewEngine (MvcContrib)
Obiettivi di progettazione:
Un motore di visualizzazione basato su NVelocità che è una porta .NET del popolare progetto Java Velocità.
Professionisti:
- facile da leggere/scrivere
- codice di visualizzazione conciso
Contro:
- numero limitato di metodi di supporto disponibili nella vista
- non dispone automaticamente dell'integrazione con Visual Studio (IntelliSense, controllo delle visualizzazioni in fase di compilazione o refactoring)
Esempio:
#foreach ($p in $viewdata.Model)
#beforeall
<ul>
#each
<li>$p.Name</li>
#afterall
</ul>
#nodata
<p>No products available</p>
#end
Obiettivi di progettazione:
SharpTiles è un port parziale di JSTLcombinato con il concetto alla base del Framework di piastrelle (a partire dalla pietra miliare 1).
Professionisti:
- familiare agli sviluppatori Java
- Blocchi di codice in stile XML
Contro:
- ...
Esempio:
<c:if test="${not fn:empty(Page.Tiles)}">
<p class="note">
<fmt:message key="page.tilesSupport"/>
</p>
</c:if>
Motore di visualizzazione Spark
Obiettivi di progettazione:
L'idea è di consentire all'HTML di dominare il flusso e il codice per adattarsi perfettamente.
Professionisti:
- Produce modelli più leggibili
- IntelliSense C# (per VS2008 senza ReSharper)
- Plug-in SparkSense per VS2010 (funziona con ReSharper)
- Fornisce un potente Funzionalità di associazione per sbarazzarsi di Tutto codice nelle tue visualizzazioni e ti consente di inventare facilmente i tuoi tag HTML
Contro:
- Nessuna chiara separazione della logica del modello dal markup letterale (questo può essere mitigato dai prefissi dello spazio dei nomi)
Esempio:
<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>
Motore di visualizzazione StringTemplate MVC
Obiettivi di progettazione:
- Leggero.Non viene creata alcuna classe di pagina.
- Veloce.I modelli vengono scritti nel flusso di output della risposta.
- Memorizzato nella cache.I modelli sono memorizzati nella cache, ma utilizza un waskestemwatcher per rilevare le modifiche al file.
- Dinamico.I modelli possono essere generati al volo nel codice.
- Flessibile.I modelli possono essere nidificati a qualsiasi livello.
- In linea con i principi MVC.Promuove la separazione dell'interfaccia utente e della logica aziendale.Tutti i dati vengono creati in anticipo e trasmessi al modello.
Professionisti:
- familiare agli sviluppatori Java StringTemplate
Contro:
- la sintassi semplicistica del modello può interferire con l'output previsto (ad es. Conflitto jQuery)
Wing Beats è un DSL interno per la creazione di XHTML.È basato su F# e include un motore di visualizzazione ASP.NET MVC, ma può anche essere utilizzato esclusivamente per la sua capacità di creare XHTML.
Professionisti:
- Controllo in fase di compilazione di XML valido
- Colorazione della sintassi
- Intellisenso completo
- Viste compilate
- Estendibilità utilizzando classi, funzioni, ecc. CLR regolari
- Componibilità e manipolazione perfette poiché si tratta di codice F# normale
- Unità testabile
Contro:
- In realtà non scrivi HTML ma codice che rappresenta HTML in un DSL.
Obiettivi di progettazione:
Crea visualizzazioni da XSLT familiare
Professionisti:
- ampiamente onnipresente
- linguaggio di modelli familiare per gli sviluppatori XML
- Basato su XML
- testato nel tempo
- Gli errori di sintassi e di annidamento degli elementi possono essere rilevati staticamente.
Contro:
- lo stile linguistico funzionale rende difficile il controllo del flusso
- XSLT 2.0 non è (probabilmente?) supportato.(XSLT 1.0 è molto meno pratico).
Altri suggerimenti
La mia scelta attuale è Razor. E 'molto pulito e facile da leggere e mantiene le pagine di visualizzazione molto facile da mantenere. C'è anche il supporto di IntelliSense, che è davvero grande. Alos, quando viene utilizzato con aiutanti web è davvero potente troppo.
Per fornire un esempio semplice:
@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>
E il gioco è fatto. Questo è molto pulito e facile da leggere. Certo, questo è un semplice esempio, ma anche sulle pagine complesse e forma è ancora molto facile da leggere e capire.
Per quanto riguarda i contro? Bene finora (sono nuovo a questo) quando si utilizzano alcune delle aiutanti per le forme v'è una mancanza di supporto per l'aggiunta di un riferimento di classe CSS che è un po 'fastidioso.
Grazie Nathj07
So che questo in realtà non rispondere alla tua domanda, ma diversi Vista Motori di avere scopi diversi. Il Spark View Engine , per esempio, ha lo scopo di liberare le vostre opinioni di "zuppa di tag", cercando di rendere tutto fluente e leggibile.
La cosa migliore sarebbe quella di guardare solo ad alcune implementazioni. Se sembra attraente per l'intento della soluzione, provalo. È possibile combinare visualizzazione motori in MVC, quindi non dovrebbe essere un problema se si decide di non andare con un motore specifico.
Controlla questo SharpDOM . Si tratta di un DSL interno per la generazione di html e anche asp.net motore di visualizzazione mvc c # 4.0.
Mi piace ndjango . E 'molto facile da usare e molto flessibile. Si può facilmente estendere la funzionalità di visualizzazione con tag personalizzati e filtri. Credo che "fortemente legato al F #" è piuttosto vantaggio di svantaggio.
Credo che questa lista dovrebbe includere anche campioni di ogni motore di visualizzazione in modo gli utenti possono ottenere un sapore di ciascuna, senza dover visitare ogni sito web.
Le immagini valgono più di mille parole e campioni di markup sono come le immagini per i motori view :) Quindi, ecco uno dal mio preferito rel="nofollow 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>