Motori di visualizzazione ASP.NET MVC (Wiki della community)
Dal momento che un elenco completo non sembra esistere, iniziamo uno qui su SO. Questo può essere di grande valore per la comunità ASP.NET MVC se le persone aggiungono la loro esperienza (specialmente chiunque abbia contribuito a uno di questi). Qualsiasi implementazione IViewEngine
(ad es. VirtualPathProviderViewEngine
) È un gioco equo qui. Basta alfabetizzare 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 utilizzato per eseguire il rendering di una pagina di moduli Web alla risposta.
Professionisti:
- onnipresente poiché 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)
- compilation su richiesta o viste precompilate
Contro:
- l'utilizzo è confuso dall'esistenza di schemi "classici ASP.NET" che non si applicano più in MVC (ad es. ViewState PostBack)
- può contribuire all'anti-pattern di "tag soup"
- La sintassi del blocco di codice e la tipizzazione forte possono interferire
- IntelliSense applica uno stile non sempre appropriato per i blocchi di codice in linea
- può essere rumoroso quando si progettano 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>
<%}%>
System.Web.Razor
Obiettivi di progettazione:
Professionisti:
- Compatto, espressivo e fluido
- Facile da imparare
- Non è una nuova lingua
- Ha un ottimo Intellisense
- Unità testabile
- Ubiquo, fornito con ASP.NET MVC
Contro:
- Crea un problema leggermente diverso dal "tag soup" di cui sopra. Laddove i tag del server in realtà forniscono una struttura attorno al codice server e non server, Razor confonde HTML e codice server, rendendo difficile lo sviluppo di puro HTML o JS (vedi Con Esempio n. 1) mentre finisci per dover "sfuggire" a HTML e / o JavaScript tag in determinate condizioni molto comuni.
- Scarsa incapsulamento + reuseabilità: è impraticabile 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 miscelazione di codice e presentazione.
- La sintassi è molto orientata all'html; la generazione di contenuti non HTML può essere complicata. Nonostante ciò, il modello di dati del rasoio è essenzialmente solo una concatenazione di stringhe, quindi gli errori di sintassi e di annidamento non vengono rilevati né staticamente né dinamicamente, sebbene il design-time VS.NET aiuti a mitigarlo in qualche modo. A causa di ciò, la manutenibilità e la rifattabilità possono risentirne.
Nessuna API documentata , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx
Con Esempio n. 1 (notare il posizionamento di "string [] ..."):
@{
<h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
foreach (var person in teamMembers)
{
<p>@person</p>
}
}
Bellevue
Obiettivi di progettazione:
- Rispetta l'HTML come linguaggio di prima classe anziché trattarlo come "solo testo".
- Non scherzare con il mio HTML! Il codice di associazione dei dati (codice Bellevue) deve essere separato dall'HTML.
- Applicare una rigorosa separazione vista modello
Brail
Obiettivi di progettazione:
Il motore di visualizzazione Brail è stato portato da MonoRail per funzionare con Microsoft ASP.NET MVC Framework. Per un'introduzione a Brail, consultare la documentazione sul sito Web del progetto Castle .
Professionisti:
- modellato sulla "sintassi del pitone adatta al polso"
- Visualizzazioni compilate su richiesta (ma nessuna precompilazione disponibile)
Contro:
- progettato per essere scritto nella lingua Boo
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
Hasic usa i letterali XML di VB.NET invece delle stringhe come la maggior parte degli altri motori di visualizzazione.
Professionisti:
- Verifica in fase di compilazione di XML valido
- Sintassi colorazione
- Pieno intellisenso
- Viste compilate
- Estensibilità usando normali classi CLR, funzioni, ecc
- Composibilità e manipolazione senza soluzione di continuità poiché si tratta del normale codice VB.NET
- Unità testabile
Contro:
- Prestazioni: crea l'intero DOM prima di inviarlo al client.
Esempio:
Protected Overrides Function Body() As XElement
Return _
<body>
<h1>Hello, World</h1>
</body>
End Function
NDjango
Obiettivi di progettazione:
NDjango è un'implementazione del
Django Template Language sulla piattaforma .NET, usando il linguaggio F # .
Professionisti:
NHaml
Obiettivi di progettazione:
Porta .NET di Rails Haml view engine. Dal sito Web Haml :
Haml è un linguaggio di markup utilizzato per descrivere in modo chiaro e semplice l'XHTML di qualsiasi documento Web, senza l'uso del codice incorporato ... Haml evita la necessità di codificare esplicitamente l'XHTML nel modello, perché in realtà è una descrizione astratta dell'XHTML , con un po 'di codice per generare contenuti dinamici.
Professionisti:
- struttura concisa (cioè SECCO)
- ben rientrato
- struttura chiara
- C # Intellisense (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
NVelocity che è una porta .NET del popolare progetto Java
Velocity .
Professionisti:
- facile da leggere / scrivere
- codice di visualizzazione conciso
Contro:
- numero limitato di metodi di supporto disponibili nella vista
- non ha automaticamente l'integrazione di 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
SharpTiles
Obiettivi di progettazione:
SharpTiles è una porta parziale di JSTL
combinata con il concetto dietro il framework Tiles (a partire da Mile stone 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>
Spark View Engine
Obiettivi di progettazione:
L'idea è di consentire all'html di dominare il flusso e il codice per adattarsi perfettamente.
Professionisti:
- Produce modelli più leggibili
- C # Intellisense (per VS2008 senza ReSharper)
- Plug-in SparkSense per VS2010 (funziona con ReSharper)
- Fornisce una potente funzione di binding per sbarazzarsi di tutto il codice nelle visualizzazioni e consente di inventare facilmente i propri 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>
StringTemplate Visualizza Engine MVC
Obiettivi di progettazione:
- Leggero. Nessuna classe di pagina creata.
- Veloce. I modelli vengono scritti nel flusso di output della risposta.
- Copia cache. I modelli sono memorizzati nella cache, ma utilizzano un FileSystemWatcher per rilevare le modifiche ai 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 di UI e Business Logic. Tutti i dati vengono creati in anticipo e passati al modello.
Professionisti:
- familiare agli sviluppatori Java StringTemplate
Contro:
- la sintassi del modello semplicistica può interferire con l'output previsto (ad esempio conflitto jQuery )
Wing Beats
Wing Beats è un DSL interno per la creazione di XHTML. Si basa 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:
- Verifica in fase di compilazione di XML valido
- Sintassi colorazione
- Pieno intellisenso
- Viste compilate
- Estensibilità usando normali classi CLR, funzioni, ecc
- Composibilità e manipolazione senza interruzioni dal momento che è un normale codice F #
- Unità testabile
Contro:
- In realtà non scrivi HTML ma codice che rappresenta HTML in un DSL.
XsltViewEngine (MvcContrib)
Obiettivi di progettazione:
Crea viste da XSLT familiare
Professionisti:
- ampiamente onnipresente
- linguaggio di template familiare per sviluppatori XML
- basata su XML
- time-tested
- Sintassi ed errori di annidamento degli elementi possono essere rilevati staticamente.
Contro:
- lo stile del linguaggio funzionale rende difficile il controllo del flusso
- XSLT 2.0 non è (probabilmente?) Supportato. (XSLT 1.0 è molto meno pratico).