Comparaison du moteur de vue ASP.NET MVC

339

J'ai recherché sur SO & Google une ventilation des différents moteurs de vue disponibles pour ASP.NET MVC, mais je n'ai pas trouvé beaucoup plus que de simples descriptions de haut niveau de ce qu'est un moteur de vue.

Je ne recherche pas nécessairement "le meilleur" ou "le plus rapide" mais plutôt des comparaisons du monde réel des avantages / inconvénients des principaux acteurs (par exemple le WebFormViewEngine par défaut, les moteurs de visualisation MvcContrib, etc.) pour diverses situations. Je pense que cela serait vraiment utile pour déterminer si le passage du moteur par défaut serait avantageux pour un projet ou un groupe de développement donné.

Quelqu'un at-il rencontré une telle comparaison?

mckamey
la source
43
Ironique, il n'est "pas constructif", mais a apporté beaucoup de valeur à ceux qui l'ont consulté près de 45 000 fois. Dommage que SO restreigne leur propre utilité malgré les besoins de la communauté. Je doute que @ jeff-atwood se sentirait de cette façon.
mckamey

Réponses:

430

Moteurs de vue ASP.NET MVC (Wiki de communauté)

Puisqu'une liste complète ne semble pas exister, commençons-en une ici sur SO. Cela peut être d'une grande valeur pour la communauté ASP.NET MVC si les gens ajoutent leur expérience (en particulier ceux qui ont contribué à l'un d'entre eux). Tout ce qui est mis en œuvre IViewEngine(par exemple VirtualPathProviderViewEngine) est un jeu équitable ici. Alphabétisez simplement les nouveaux moteurs de vue (en laissant WebFormViewEngine et Razor en haut) et essayez d'être objectif dans les comparaisons.


System.Web.Mvc.WebFormViewEngine

Objectifs de conception:

Moteur de vue utilisé pour restituer une page Web Forms à la réponse.

Avantages:

  • omniprésent car il est livré avec ASP.NET MVC
  • expérience familière pour les développeurs ASP.NET
  • IntelliSense
  • peut choisir n'importe quelle langue avec un fournisseur CodeDom (par exemple C #, VB.NET, F #, Boo, Nemerle)
  • compilation à la demande ou vues précompilées

Les inconvénients:

  • l'utilisation est confondue par l'existence de modèles "ASP.NET classiques" qui ne s'appliquent plus dans MVC (par exemple ViewState PostBack)
  • peut contribuer à l'anti-modèle de "soupe de tag"
  • la syntaxe des blocs de code et le typage fort peuvent gêner
  • IntelliSense applique le style pas toujours approprié pour les blocs de code en ligne
  • peut être bruyant lors de la conception de modèles 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>
<%}%>

System.Web.Razor

Objectifs de conception:

Avantages:

  • Compact, expressif et fluide
  • Facile à apprendre
  • N'est pas une nouvelle langue
  • Possède une grande intelligence
  • Testable à l'unité
  • Ubiquitaire, livré avec ASP.NET MVC

Les inconvénients:

  • Crée un problème légèrement différent de la "soupe de tag" référencée ci-dessus. Lorsque les balises serveur fournissent réellement une structure autour du code serveur et non serveur, Razor confond le code HTML et le code serveur, ce qui rend le développement HTML ou JS pur difficile (voir l'exemple de con # 1) car vous finissez par avoir à "échapper" HTML et / ou JavaScript balises dans certaines conditions très courantes.
  • Mauvaise encapsulation + réutilisabilité: il n'est pas pratique d'appeler un modèle de rasoir comme s'il s'agissait d'une méthode normale - en pratique, le rasoir peut appeler du code mais pas l'inverse, 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 rasoir est essentiellement une concaténation de chaînes, de sorte que les erreurs de syntaxe et d'imbrication ne sont ni statiquement ni dynamiquement détectées, bien que l'aide à la conception de VS.NET atténue quelque peu cela. La maintenabilité et la refactorabilité peuvent en souffrir.
  • Aucune API documentée , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Exemple n ° 1 (notez le placement de "string [] ..."):

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

Bellevue

Objectifs de conception:

  • Respectez le HTML comme langage de première classe au lieu de le traiter comme "juste du texte".
  • Ne plaisante pas avec mon HTML! Le code de liaison de données (code Bellevue) doit être distinct du HTML.
  • Appliquer une séparation stricte de la vue modèle

Brail

Objectifs de conception:

Le moteur de vue Brail a été porté depuis MonoRail pour fonctionner avec Microsoft ASP.NET MVC Framework. Pour une introduction à Brail, consultez la documentation sur le site Web du projet Castle .

Avantages:

  • calqué sur la "syntaxe python conviviale"
  • Vues compilées à la demande (mais pas de précompilation disponible)

Les 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

Hasic utilise les littéraux XML de VB.NET au lieu de chaînes comme la plupart des autres moteurs de vue.

Avantages:

  • Vérification au moment de la compilation du XML valide
  • Coloration syntaxique
  • Intellisense complet
  • Vues compilées
  • Extensibilité à l'aide de classes, fonctions, etc. CLR régulières
  • Composabilité et manipulation sans faille puisque c'est du code VB.NET normal
  • Testable à l'unité

Les inconvénients:

  • 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

Objectifs de conception:

NDjango est une implémentation du Django Template Language sur la plate-forme .NET, utilisant le langage F # .

Avantages:


NHaml

Objectifs de conception:

Port .NET du moteur de visualisation Haml de Rails. Du site Haml :

Haml est un langage de balisage qui est utilisé pour décrire proprement et simplement le XHTML de tout document Web, sans utiliser de code en ligne ... Haml évite d'avoir à coder explicitement XHTML dans le modèle, car il s'agit en fait d'une description abstraite du XHTML , avec du code pour générer du contenu dynamique.

Avantages:

  • structure laconique (c.-à-d. SEC)
  • bien échancré
  • structure claire
  • C # Intellisense (pour VS2008 sans ReSharper)

Les inconvénients:

  • une abstraction de XHTML plutôt que de tirer parti de la familiarité du balisage
  • Pas d'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)

Objectifs de conception:

Un moteur de vue basé sur NVelocity qui est un port .NET du populaire projet Java Velocity .

Avantages:

  • facile à lire / écrire
  • code de vue concise

Les inconvénients:

  • nombre limité de méthodes d'assistance disponibles sur la vue
  • n'a pas automatiquement l'intégration de Visual Studio (IntelliSense, vérification des vues à la compilation ou refactoring)

Exemple:

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

SharpTiles

Objectifs de conception:

SharpTiles est un port partiel de JSTL combiné avec le concept derrière le framework Tiles (à partir de Mile stone 1).

Avantages:

  • familier aux développeurs Java
  • Blocs de code de style XML

Les inconvénients:

  • ...

Exemple:

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

Spark View Engine

Objectifs de conception:

L'idée est de permettre au html de dominer le flux et au code de s'adapter parfaitement.

Avantages:

  • Produit des modèles plus lisibles
  • C # Intellisense (pour VS2008 sans ReSharper)
  • Plug-in SparkSense pour VS2010 (fonctionne avec ReSharper)
  • Fournit une puissante fonction de liaisons pour se débarrasser de tout le code dans vos vues et vous permet d'inventer facilement vos propres balises HTML

Les inconvénients:

  • Pas de séparation claire entre la logique du modèle et le balisage littéral (cela peut être atténué par les préfixes d'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

Objectifs de conception:

  • Poids léger. Aucune classe de page n'est créée.
  • Vite. Les modèles sont écrits dans le flux de sortie de réponse.
  • En cache. Les modèles sont mis en cache, mais utilisent un FileSystemWatcher pour détecter les modifications de fichiers.
  • Dynamique. Les modèles peuvent être générés à la volée dans le code.
  • Souple. Les modèles peuvent être imbriqués à n'importe quel niveau.
  • Conformément aux principes MVC. Favorise la séparation de l'interface utilisateur et de la logique métier. Toutes les données sont créées à l'avance et transmises au modèle.

Avantages:

  • familier aux développeurs StringTemplate Java

Les inconvénients:

  • la syntaxe de modèle simpliste peut interférer avec la sortie souhaitée (par exemple, conflit jQuery )

Battements d'ailes

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

Avantages:

  • Vérification au moment de la compilation du XML valide
  • Coloration syntaxique
  • Intellisense complet
  • Vues compilées
  • Extensibilité à l'aide de classes, fonctions, etc. CLR régulières
  • Composabilité et manipulation sans faille puisque c'est du code F # normal
  • Testable à l'unité

Les inconvénients:

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

XsltViewEngine (MvcContrib)

Objectifs de conception:

Construit des vues à partir de XSLT familier

Avantages:

  • largement omniprésent
  • langage de modèle familier pour les développeurs XML
  • Basé sur XML
  • éprouvé dans le temps
  • Les erreurs d'imbrication de syntaxe et d'élément peuvent être détectées statiquement.

Les inconvénients:

  • le style de langage fonctionnel rend le contrôle des flux difficile
  • XSLT 2.0 n'est (probablement?) Pas pris en charge. (XSLT 1.0 est beaucoup moins pratique).

mckamey
la source
9
@ BrianLy: parce que F # est compilé et fonctionnel, ce qui signifie qu'il est rapide, plus interopérable avec le reste du runtime (au moins jusqu'à c # 4) et idempotent. nous avons d'abord emprunté la voie ironpython, mais nous n'étions pas satisfaits des résultats. en ce qui concerne la dénomination - nous sommes ouverts aux suggestions :)
kolosy
7
Vote contre en raison de la section Cons de Brail. Avoir Boo comme langue n'est certainement pas un inconvénient.
Owen
48
@Owen: Oui, c'est ça. Vous devez considérer cela du point de vue d'un développeur C #. Vous ne voulez pas apprendre une autre langue simplement pour utiliser un moteur de modèles. (naturellement si vous connaissez déjà Boo, c'est cool, mais pour la majorité des développeurs C #, c'est un obstacle supplémentaire à surmonter)
Christian Klauser
5
Le rasoir est là-dedans. Il doit être mis à jour pour alphabétiser Razor.
mckamey
3
Boo est un Pro, pas un Con. Vous êtes déjà "en dehors" de C #, plus le modèle peut s'améliorer. Le C # n'était pas destiné à être utilisé dans un contexte de "modèle", il est quelque peu expressif mais pas "compatible avec les poignets". D'un autre côté, BOO a été créé dans cet esprit et en tant que tel, il se prête beaucoup mieux à être utilisé dans un contexte de modèles.
Loudenvier
17

Mon choix actuel est Razor. Il est très propre et facile à lire et maintient les pages d'affichage très faciles à entretenir. Il existe également un support intellisense qui est vraiment génial. ALos, lorsqu'il est utilisé avec des aides Web, il est également très puissant.

Pour fournir un exemple 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 voila. 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 toujours très facile à lire et à comprendre.

Quant aux inconvénients? Eh bien jusqu'à présent (je suis nouveau dans ce domaine) lors de l'utilisation de certains assistants pour les formulaires, il n'y a pas de prise en charge pour l'ajout d'une référence de classe CSS, ce qui est un peu ennuyeux.

Merci Nathj07

nathj07
la source
1
Ah! Je viens de remarquer l'âge de cette discussion. Eh bien, peut-être que quelqu'un le trouvera et cela s'avérera toujours utile.
nathj07
10

Je sais que cela ne répond pas vraiment à votre question, mais les différents moteurs de vue ont des objectifs différents. Le Spark View Engine , par exemple, vise à débarrasser vos vues de la "soupe de tag" en essayant de rendre tout fluide et lisible.

Votre meilleur pari serait de simplement regarder quelques implémentations. Si cela semble attrayant pour l'intention de votre solution, essayez-la. Vous pouvez mélanger et faire correspondre les moteurs de vue dans MVC, donc cela ne devrait pas être un problème si vous décidez de ne pas utiliser un moteur spécifique.

MunkiPhD
la source
Merci d'avoir répondu. Je commençais littéralement ce que vous aviez suggéré lorsque je me suis dit que "quelqu'un devait déjà avoir fait un résumé". J'espère une certaine agrégation de ces types d'objectifs de conception et de lacunes. "Le Spark View Engine ... vise à débarrasser votre point de vue de la" soupe de tag "en essayant de rendre tout fluide et lisible." Cela implique une raison de le construire ainsi qu'une lacune du moteur de vue par défaut. Encore une balle dans la liste.
mckamey
7

Vérifiez ce SharpDOM . Il s'agit du dsl interne ac # 4.0 pour générer du HTML et également du moteur de vue mvc asp.net.

Anton Shelin
la source
Cela semble être le seul moyen raisonnable de créer des vues.
Stephan Eggermont
pouvez-vous l'ajouter à la réponse générale du wiki?
Mauricio Scheffer
Je ne le trouve plus sur CodePlex ou Google. Où est-il allé?? (C'est toujours sur Codeproject: codeproject.com/Articles/667581/… )
Jared Thirsk
5

J'aime ndjango . Il est très simple d'utilisation et très flexible. Vous pouvez facilement étendre la fonctionnalité d'affichage avec des balises et des filtres personnalisés. Je pense que "fortement lié à F #" est plutôt un avantage qu'un inconvénient.

rdovhan
la source
4

Je pense que cette liste devrait également inclure des échantillons de chaque moteur de vue afin que les utilisateurs puissent en avoir une idée sans avoir à visiter chaque site Web.

Les images disent mille mots et les échantillons de balisage sont comme des captures d'écran pour les moteurs de vue :) Alors, voici celui de mon moteur de vue Spark préféré

<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>
mythz
la source
4
ressemble trop à Coldfusion. Je ne suis pas un grand fan du mélange de code dans un balisage comme celui-ci. Cela devient difficile à entretenir.
Agile Jedi