ASP.NET comparaison des moteurs MVC View

j'ai cherché sur So & Google pour une ventilation des divers moteurs de vue disponibles pour ASP.NET MVC, mais n'ont pas trouvé beaucoup plus que de simples descriptions de haut niveau de ce qu'est un moteur de vue.

Je ne suis pas nécessairement à la recherche de" meilleur "ou" plus rapide", mais plutôt de quelques comparaisons réelles des avantages / désavantages des principaux acteurs (par exemple, le moteur webformviewengine par défaut, les moteurs de Mvccontrib View, etc.) pour diverses situations. Je pense que ce serait vraiment utile pour déterminer si passer du moteur par défaut serait avantageux pour un projet ou un groupe de développement donné.

quelqu'un A rencontré une telle comparaison?

334
demandé sur casperOne 2009-09-20 19:47:47

6 réponses

ASP.NET MVC View Engines (Community Wiki)

comme il ne semble pas y avoir de liste exhaustive, commençons par celle-ci. Cela peut être d'une grande valeur pour le ASP.NET MVC community si les gens ajoutent leur expérience (esp. toute personne qui a contribué à l'un de ces éléments). Tout ce qui met en œuvre IViewEngine (par exemple VirtualPathProviderViewEngine ) est juste ici. Juste alphabétiser Les moteurs de nouvelle vue( laissant WebFormViewEngine et Razor au sommet), et essayer d'être objectif dans comparaison.


système.Web.Mvc.WebFormViewEngine

Les Objectifs De La Conception:

un moteur de vue qui est utilisé pour rendre Page des formulaires Web à la réponse.

Pour:

  • ubiquitaire puisqu'il ASP.NET MVC
  • familier expérience pour ASP.NET développeurs
  • IntelliSense
  • peut choisir n'importe quelle langue avec un fournisseur de code (par exemple C#, VB.NET, F#, Boo, Nemerle)
  • compilation à la demande ou précompilé vues

Inconvénients:

  • l'usage est confondu par l'existence de "classique ASP.NET" modèles qui ne s'appliquent plus dans MVC (par exemple ViewState PostBack))
  • peut contribuer à l'anti-modèle de "tag soup"
  • la syntaxe de bloc de code et de Fort-typage peut obtenir dans la manière
  • IntelliSense renforce le style pas toujours approprié pour les blocs de code en ligne
  • peut être bruyant lors de la conception de gabarits simples

exemple:

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

système.Web.Rasoir

Les Objectifs De La Conception:

Pour:

  • Compact, expressif, et fluide
  • facile à apprendre
  • N'est pas une nouvelle langue
  • a un grand Intellisense
  • Unité Vérifiable
  • Ubiquitous, ships with ASP.NET MVC

Inconvénients:

  • crée un problème légèrement différent de "tag soup" mentionné ci-dessus. Là où les balises de serveur fournissent en fait une structure autour du code serveur et non-serveur, Razor confond le code HTML et le code serveur, rendant le développement HTML ou JS Difficile (Voir L'exemple #1) car vous finissez par avoir à "échapper" les balises HTML et / ou JavaScript dans certaines conditions très courantes.
  • mauvaise encapsulation+réutilisabilité: il n'est pas pratique d'appeler un modèle de rasoir comme si il s'agissait d'une méthode normale - dans la pratique razor peut appeler code, mais pas vice versa, ce qui peut encourager le mélange de code et de présentation.
  • La syntaxe
  • est très orientée html; générer du contenu non-html peut être délicat. Malgré cela, le modèle de données de razor est essentiellement juste chaîne-concaténation, de sorte que les erreurs de syntaxe et de nidification ne sont pas statiquement ni dynamiquement détectés, bien que VS.NET l'aide relative au délai de conception atténue quelque peu cette situation. La maintenabilité et la refactabilité peuvent souffrir en raison de ce.
  • pas d'API documentée , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Con Exemple #1 (remarquez l'implantation de "string[]..."):

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

Bellevue

les objectifs de la Conception:

  • respecte le HTML comme langage de première classe au lieu de le traiter comme du "texte juste".
  • Ne jouez pas avec mon code HTML! Le code liant les données (code Bellevue) doit être séparé de HTML.
  • Appliquer strictement Modèle-Vue de la séparation

Braille

Les Objectifs De La Conception:

le moteur Brail view a été porté du MonoRail au travail avec le Microsoft ASP.NET MVC Framework. Pour une introduction à Brail, voir le documentation sur le projet du château site web .

Pour:

  • modelé d'après" syntaxe Python conviviale "
  • À la demande compilé vues (mais pas de précompilation disponible)

Inconvénients:

  • conçu pour être écrit dans la langue Boo

exemple:

<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

utilisations Hasic VB.NET ' s XML littérales au lieu de chaînes de caractères comme la plupart des autres moteurs de vue.

Pour:

  • Compilation-time checking of valid XML
  • coloration syntaxique
  • "1519320920 Complet" intellisense
  • vues compilées
  • extensibilité utilisant les classes CLR régulières, les fonctions, etc
  • composabilité et manipulation sans soudure depuis qu'il est régulier VB.NET code
  • Unité vérifiable

Points de vente:

  • Performance: construit le DOM entier avant de l'envoyer au client.

exemple:

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

NDjango

Les Objectifs De La Conception:

NDjango est une mise en œuvre de la Django Template Language sur le .NET plate-forme, utilisant le F # language .

Pour:


NHaml

Les Objectifs De La Conception:

.NET port de Rails Haml moteur d'affichage. De le site de Haml :

Haml est un langage de balisage utilisé pour décrire clairement et simplement XHTML de tout document web, sans la utilisation du code inline... Haml évite le nécessité de coder explicitement XHTML en le modèle, car il est effectivement une description abstraite du XHTML, avec un peu de code pour générer la dynamique contenu.

Pour:

  • terse structure (i.e. D. R. Y.)
  • bien en retrait
  • structure claire
  • C# Intellisense (pour VS2008 sans ReSharper)

Inconvénients:

  • une abstraction de XHTML plutôt que de tirer profit de la familiarité du markup
  • Aucun Intellisense pour VS2010

exemple:

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

NVelocityViewEngine (MvcContrib)

Les Objectifs De La Conception:

moteur de vision basé sur NVelocity qui est un port. net du populaire projet Java Vitesse .

Pour:

  • facile à lire / écrire
  • concis afficher le code

Inconvénients:

  • nombre limité de méthodes d'aide disponibles sur la vue
  • ne possède pas automatiquement L'intégration Visual Studio (IntelliSense, la vérification des vues à la compilation, ou le remodelage)

exemple:

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

SharpTiles

Les Objectifs De La Conception:

SharpTiles est un port partiel de JSTL combiné avec concept des tuiles cadre (comme de la pierre Mile 1).

Pour:

  • familière aux développeurs Java
  • blocs de code de style XML

Inconvénients:

  • ...

exemple:

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

L'Étincelle Du Moteur D'Affichage

Les Objectifs De La Conception:

L'idée est de permettre à l'html dominer le flux et le code pour l'adapter transparente.

Pour:

Inconvénients:

  • pas de séparation claire entre la logique du modèle et le balisage littéral (ceci peut être atténué par les préfixes de l'espace de noms)

exemple:

<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

Les Objectifs De La Conception:

  • léger. Aucune classe de page n'est créée.
  • Fast. Les modèles sont écrits dans le flux de sortie de la réponse.
  • mis en Cache. Les modèles sont cache, mais utilise un système de fichiers pour détecter les modifications de fichiers.
  • Dynamic. Les gabarits peuvent être générés à la volée dans le code.
  • Flexible. Les modèles peuvent être imbriqués à n'importe quel niveau.
  • conformément aux principes MVC. Favorise la séparation de l'INTERFACE et des Affaires Logique. Toutes les données sont créées avant temps, et transmis au modèle.

Pour:

  • familier StringTemplate développeurs Java

Inconvénients:

  • la syntaxe simpliste des gabarits peut interférer avec la sortie prévue (par exemple conflit jQuery )

Battements D'Ailes

Wing Beats est un DSL interne pour la création de XHTML. Il est basé sur F# et comprend un ASP.NET MVC view engine, mais peut également être utilisé uniquement pour sa capacité de créer XHTML.

Pour:

  • Compilation-time checking of valid XML
  • coloration syntaxique
  • "1519320920 Complet" intellisense
  • vues compilées
  • extensibilité utilisant les classes CLR régulières, les fonctions, etc
  • composabilité et manipulation sans soudure depuis qu'il est régulier F# code
  • Unité vérifiable

Inconvénients:

  • vous n'écrivez pas vraiment du code HTML mais du code qui représente du code HTML dans un DSL.

XsltViewEngine (MvcContrib)

Objectifs De Conception:

construit des vues à partir de XSLT familier

Pour:

  • largement répandu
  • familier modèle de langage pour XML développeurs
  • basé sur XML
  • testé dans le temps
  • Les erreurs de syntaxe
  • et d'imbrication d'éléments peuvent être détectées statiquement.

Inconvénients:

  • langage fonctionnel de style rend le contrôle de flux difficile
  • XSLT 2.0 est (sans doute?) non pris en charge. (XSLT 1.0 est beaucoup moins pratique).

428
répondu mckamey 2017-05-23 12:18:26

mon choix actuel est Razor. Il est très propre et facile à lire et maintient l'affichage des pages très facile à entretenir. Il y a aussi le support intellisense qui est vraiment grand. ALos, lorsqu'il est utilisé avec des helpers web, il est vraiment puissant aussi.

pour fournir un échantillon simple:

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

et voilà. C'est très propre et facile à lire. Certes, c'est un exemple simple, mais même sur des pages et des formulaires complexes, il est encore très facile à lire. et de comprendre.

et les contre? Eh bien jusqu'à présent (je suis nouveau à cela) en utilisant certains des helpers pour les formulaires Il ya un manque de soutien pour ajouter une référence de classe CSS qui est un peu ennuyeux.

Merci Nathj07

18
répondu nathj07 2011-11-13 19:21:15

je sais que cela ne répond pas vraiment à votre question, mais différents moteurs de vision ont des buts différents. Le Spark View Engine , par exemple, vise à débarrasser vos vues de" tag soup " en essayant de faire tout fluent et lisible.

Votre meilleur pari serait de regarder certaines implémentations. Si votre solution semble séduisante, essayez-la. Vous pouvez mélanger et assortir les moteurs de vue dans MVC, donc il ne devrait pas être un problème si vous décider de ne pas aller avec un moteur spécifique.

11
répondu MunkiPhD 2009-09-20 15:49:23

Cochez cette SharpDOM . Il s'agit d'un C# 4.0 dsl interne pour générer html et aussi asp.net moteur de vue mvc.

9
répondu Anton Shelin 2010-04-30 21:10:34

j'aime ndjango . Il est très facile à utiliser et très flexible. Vous pouvez facilement étendre la fonctionnalité de vue avec des étiquettes et des filtres personnalisés. Je pense que "fortement lié à F#" est un avantage plutôt qu'un inconvénient.

5
répondu rdovhan 2010-02-25 19:48:57

je pense que cette liste devrait également inclure des échantillons de chaque moteur de vue afin que les utilisateurs puissent obtenir une saveur de chacun sans avoir à visiter chaque site web.

les photos disent un millier de mots et les échantillons de balisage sont comme des captures d'écran pour les moteurs de vue :) donc voici un de mon préféré moteur de vision à étincelles

<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>
4
répondu mythz 2010-10-12 21:01:48