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?
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>
<%}%>
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>
}
}
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
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>
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
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:
- NDjango release 0.9.1.0 semble être plus stable sous stress que
WebFormViewEngine
- Éditeur de Template de Django avec la colorisation de la syntaxe, la complétion de code, et selon le type de diagnostic (VS2010 uniquement)
- intégré avec ASP.NET, le MonoRail du château et les cadres MVC du Bistro
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
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:
- produit des gabarits plus lisibles
- C# Intellisense (pour VS2008 sans ReSharper)
- Plug-in SparkSense pour VS2010 (fonctionne avec ReSharper)
- fournit un puissant fonction de reliures pour se débarrasser de tous code dans vos vues et vous permet d'inventer facilement vos propres balises HTML
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 )
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.
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).
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
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.
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.
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>