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?

È stato utile?

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>
<%}%>

System.Web.Razor

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>
    }
}

Bellevue

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

Brail

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

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

NDjango

Obiettivi di progettazione:

NDjango è un'implementazione di Linguaggio dei modelli Django Sulla piattaforma .NET, utilizzando il Linguaggio F#.

Professionisti:


NHaml

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

SharpTiles

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:

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)

Battiti d'ali

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.

XsltViewEngine (MvcContrib)

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top