ASP.NET MVC视图引擎比较

我一直在searchSO和Google的ASP.NET MVC的各种查看引擎的细分,但没有发现什么比视图引擎是简单的高层次的描述。

我不一定是在寻找“最好”或“最快”的,而是针对各种情况的主要玩家(例如,默认的WebFormViewEngine,MvcContrib View Engines等)的一些现实世界比较优势/劣势。 我认为这对于确定从默认引擎的转换对于给定的项目或开发组是否有利是非常有帮助的。

有没有人遇到过这样的比较?

ASP.NET MVC视图引擎(社区Wiki)

由于综合清单似乎并不存在,我们从这里开始。 如果人们添加他们的经验(尤其是对其中一个人有所贡献的人),这对ASP.NET MVC社区是非常有价值的。 任何实现IViewEngine (例如VirtualPathProviderViewEngine )的东西都是公平的游戏。 只需将新的视图引擎按字母顺序排列(将WebFormViewEngine和Razor留在顶部),并尝试比较客观。


System.Web.Mvc.WebFormViewEngine

devise目标:

用于将Web窗体页面呈现给响应的视图引擎。

优点:

  • 无处不在,因为它随ASP.NET MVC一起发行
  • 熟悉ASP.NET开发人员的经验
  • 智能感知
  • 可以selectCodeDom提供者(例如C#,VB.NET,F#,Boo,Nemerle)
  • 按需编译或预编译视图

缺点:

  • 用法被存在的“经典ASP.NET”模式混淆了,这些模式不再适用于MVC(比如ViewState PostBack)
  • 可以促成“标签汤”的反模式
  • 代码块语法和强types可以阻碍
  • 智能感知强化风格并不总是适合embedded式代码块
  • 在devise简单的模板时可能会很嘈杂

例:

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

devise目标:

优点:

  • 紧凑,富有performance力和stream畅
  • 易于学习
  • 不是一种新的语言
  • 有很棒的智能感知
  • unit testing
  • 无处不在,随ASP.NET MVC一起发行

缺点:

  • 从上面引用的“标签汤”中创build一个稍微不同的问题。 在服务器标签实际上提供围绕服务器和非服务器代码的结构的地方,Razor混淆了HTML和服务器代码,使得纯粹的HTML或JS开发具有挑战性(参见示例#1),因为最终不得不“逃离”HTML和/或JavaScript标签在某些非常常见的情况下。
  • 糟糕的封装+可重用性:把剃刀模板当作一种正常的方法来调用是不切实际的,实际上剃刀可以调用代码,反之亦然,这可以促进代码和表示的混合。
  • 语法是非常面向html的; 生成非html内容可能会非常棘手。 尽pipe如此,剃刀的数据模型基本上只是string连接,所以语法和嵌套错误既不是静态的也不是dynamic检测的,尽pipeVS.NET的devise时间有助于缓解这种情况。 由于这个原因,可维护性和可重构性会受到影响。
  • 没有logging的APIhttp://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Con Example#1(注意“string [] …”的位置):

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

贝尔维尤

devise目标:

  • 尊重HTML作为一stream的语言,而不是将其视为“正文”。
  • 不要乱用我的HTML! 数据绑定代码(Bellevue代码)应该与HTML分开。
  • 实施严格的模型 – 视图分离

抄网

devise目标:

Brail视图引擎已经从MonoRail移植到Microsoft ASP.NET MVC框架。 有关Brail的介绍,请参阅Castle项目网站上的文档。

优点:

  • 仿照“手腕友好的Python语法”
  • 按需编译视图(但不提供预编译)

缺点:

  • 旨在写在语言嘘

例:

 <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使用VB.NET的XML文字,而不是像大多数其他视图引擎那样使用string。

优点:

  • 编译时检查有效的XML
  • 语法着色
  • 完全的智能感知
  • 编译视图
  • 使用常规的CLR类,函数等的可扩展性
  • 无缝的可组合性和操作,因为它是常规的VB.NET代码
  • 单元可testing

缺点:

  • 性能:在发送给客户端之前构build整个DOM。

例:

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

NDjango

devise目标:

NDjango是.NET平台上的Django模板语言的实现,使用F#语言 。

优点:

  • NDjango版本0.9.1.0似乎比WebFormViewEngine更加稳定
  • 具有语法着色,代码完成和即用型诊断的Django模板编辑器(仅限于VS2010)
  • 与ASP.NET集成,Castle MonoRail和Bistro MVC框架

NHaml

devise目标:

Rails Haml视图引擎的.NET端口。 从Haml网站 :

Haml是一种标记语言,用于干净简单地描述任何Web文档的XHTML,而不使用内联代码… Haml避免了将XHTML显式编码到模板中的需要,因为它实际上是对XHTML的抽象描述,用一些代码来生成dynamic内容。

优点:

  • 简洁的结构(即DRY)
  • 缩进
  • 结构清晰
  • C#智能感知 (无需ReSharper的VS2008)

缺点:

  • 从XHTML抽象而不是利用标记的熟悉
  • 没有VS2010的智能感知

例:

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

NVelocityViewEngine(MvcContrib)

devise目标:

基于NVelocity的视图引擎,它是stream行的Java项目Velocity的.NET端口。

优点:

  • 容易读/写
  • 简洁的视图代码

缺点:

  • 在视图上可用的有限数量的帮助方法
  • 不会自动进行Visual Studio集成(智能感知,编译时检查视图或重构)

例:

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

SharpTiles

devise目标:

SharpTiles是JSTL的一个部分端口,与Tiles框架背后的概念相结合(如Mile stone 1)。

优点:

  • 熟悉Java开发人员
  • XML风格的代码块

缺点:

例:

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

Spark View Engine

devise目标:

这个想法是允许HTML主宰stream程和代码无缝适应。

优点:

  • 生成更可读的模板
  • C#智能感知 (无需ReSharper的VS2008)
  • VS2010的SparkSense插件 (适用于ReSharper)
  • 提供强大的绑定function ,可以清除视图中的所有代码,并可以轻松创build自己的HTML标记

缺点:

  • 模板逻辑与文字标记没有明确的分离(这可以通过命名空间前缀来减轻)

例:

 <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视图引擎MVC

devise目标:

  • 轻巧。 没有页面类被创build。
  • 快速。 模板被写入响应输出stream。
  • caching。 caching模板,但利用FileSystemWatcher检测文件更改。
  • dynamic。 模板可以在代码中实时生成。
  • 灵活。 模板可以嵌套到任何级别。
  • 符合MVC原则。 促进UI和业务逻辑的分离。 所有数据都是提前创build的,并传递给模板。

优点:

  • 熟悉StringTemplate Java开发人员

缺点:

  • 简单的模板语法可能会干扰预期的输出(例如jQuery冲突 )

永拍

Wing Beats是创buildXHTML的内部DSL。 它基于F#,包含一个ASP.NET MVC视图引擎,但也可以仅用于创buildXHTML的能力。

优点:

  • 编译时检查有效的XML
  • 语法着色
  • 完全的智能感知
  • 编译视图
  • 使用常规的CLR类,函数等的可扩展性
  • 无缝的可组合性和操作,因为它是普通的F#代码
  • 单元可testing

缺点:

  • 您不是真的写HTML,而是代表在DSL中代表HTML的代码。

XsltViewEngine(MvcContrib)

devise目标:

从熟悉的XSLT构build视图

优点:

  • 广泛无处不在
  • 熟悉XML开发人员的模板语言
  • 基于XML的
  • 经得起时间考验
  • 语法和元素嵌套错误可以静态检测。

缺点:

  • function性的语言风格使得stream量控制困难
  • XSLT 2.0(可能?)不受支持。 (XSLT 1.0是不太实际的)。

我目前的select是剃刀。 这是非常干净,易于阅读,并保持查看页面很容易维护。 也有intellisense的支持,这真的很棒。 ALos与网页助手一起使用时也非常强大。

提供一个简单的示例:

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

在那里,你有它。 这是非常干净,容易阅读。 诚然,这是一个简单的例子,但即使在复杂的页面和表单上,它仍然很容易阅读和理解。

至于缺点? 那么到目前为止(我是新来的),当使用一些表单的助手时,缺乏支持添加一个有点烦人的CSS类引用。

谢谢Nathj07

我知道这不能真正回答你的问题,但不同的视图引擎有不同的目的。 例如, Spark View Engine旨在通过尝试使所有内容stream畅可读,摆脱“标签汤”的观点。

你最好的select是只看一些实现。 如果它看起来吸引你的解决scheme的意图,试试看。 你可以在MVC中混合和匹配视图引擎,所以如果你决定不使用特定的引擎,这应该不成问题。

检查这个SharpDOM 。 这是ac#4.0内部dsl用于生成html和asp.net mvc视图引擎。

我喜欢ndjango 。 这是非常容易使用,非常灵活。 您可以使用自定义标签和filter轻松扩展视图function。 我认为“与F#紧密相连”比劣势更有优势。

我认为这个列表还应该包括每个视图引擎的样本,这样用户就可以获得每个视图的风格,而不必访问每个网站。

图片说千言万语,标记样本就像视图引擎的截图:)所以这里是我最喜欢的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>