我一直在SO和Google上搜索可用于ASP.NET MVC的各种View Engine的细分,但是除了对View Engine是什么的简单高级描述之外,没有发现更多。
我不一定要寻找“最佳”或“最快”,而是针对各种情况对主要参与者(例如默认的WebFormViewEngine,MvcContrib View Engine等)的优缺点进行一些现实世界的比较。我认为这对于确定从默认引擎进行切换是否对给定的项目或开发小组是否有帮助确实很有帮助。
有没有人遇到过这样的比较?
我一直在SO和Google上搜索可用于ASP.NET MVC的各种View Engine的细分,但是除了对View Engine是什么的简单高级描述之外,没有发现更多。
我不一定要寻找“最佳”或“最快”,而是针对各种情况对主要参与者(例如默认的WebFormViewEngine,MvcContrib View Engine等)的优缺点进行一些现实世界的比较。我认为这对于确定从默认引擎进行切换是否对给定的项目或开发小组是否有帮助确实很有帮助。
有没有人遇到过这样的比较?
Answers:
由于似乎不存在完整的列表,因此让我们从SO开始。如果人们增加了他们的经验(尤其是其中之一的贡献者),那么这对于ASP.NET MVC社区可能具有巨大的价值。任何实现IViewEngine
(例如VirtualPathProviderViewEngine
)的行为在这里都是公平的游戏。只需按字母顺序排列新的视图引擎(将WebFormViewEngine和Razor放在顶部),然后尝试比较客观即可。
System.Web.Mvc.WebFormViewEngine
设计目标:
用于向响应呈现Web窗体页面的视图引擎。
优点:
缺点:
例:
<%@ 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>
<%}%>
设计目标:
优点:
缺点:
Con示例1(请注意“ string [] ...”的位置):
@{
<h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
foreach (var person in teamMembers)
{
<p>@person</p>
}
}
设计目标:
- 将HTML视为一流的语言,而不是将其视为“纯文本”。
- 不要搞乱我的HTML!数据绑定代码(Bellevue代码)应与HTML分开。
- 强制严格的模型视图分离
设计目标:
Brail视图引擎已从MonoRail移植到Microsoft ASP.NET MVC框架。有关Brail的介绍,请参见Castle项目网站上的文档。
优点:
缺点:
例:
<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使用VB.NET的XML文字,而不是像大多数其他视图引擎一样使用字符串。
优点:
缺点:
例:
Protected Overrides Function Body() As XElement
Return _
<body>
<h1>Hello, World</h1>
</body>
End Function
设计目标:
NDjango是使用F#语言在.NET平台上实现Django模板语言的实现 。
优点:
WebFormViewEngine
设计目标:
Rails视图引擎的.NET端口。从Haml网站:
Haml是一种标记语言,用于简洁地描述任何Web文档的XHTML,而无需使用内联代码... Haml避免了将XHTML显式编码到模板中的需要,因为它实际上是XHTML的抽象描述,并带有一些代码来生成动态内容。
优点:
缺点:
例:
@type=IEnumerable<Product>
- if(model.Any())
%ul
- foreach (var p in model)
%li= p.Name
- else
%p No products available
NVelocityViewEngine(MvcContrib)
设计目标:
一个基于NVelocity的视图引擎, 它是流行的Java项目Velocity的.NET端口 。
优点:
缺点:
例:
#foreach ($p in $viewdata.Model)
#beforeall
<ul>
#each
<li>$p.Name</li>
#afterall
</ul>
#nodata
<p>No products available</p>
#end
设计目标:
优点:
缺点:
例:
<c:if test="${not fn:empty(Page.Tiles)}">
<p class="note">
<fmt:message key="page.tilesSupport"/>
</p>
</c:if>
设计目标:
这个想法是让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>
设计目标:
- 轻巧。没有创建页面类。
- 快速。模板被写入响应输出流。
- 已缓存。模板被缓存,但是利用FileSystemWatcher来检测文件更改。
- 动态。模板可以用代码即时生成。
- 灵活。模板可以嵌套到任何级别。
- 符合MVC原则。促进UI和业务逻辑的分离。所有数据都是提前创建的,并向下传递到模板。
优点:
缺点:
Wing Beats是用于创建XHTML的内部DSL。它基于F#,包括ASP.NET MVC视图引擎,但也可以仅用于创建XHTML的功能。
优点:
缺点:
设计目标:
从熟悉的XSLT构建视图
优点:
缺点:
我当前的选择是剃刀。它非常干净且易于阅读,并且使视图页面易于维护。还有智能感知支持,确实很棒。ALos,当与Web帮助程序一起使用时,它的功能也非常强大。
要提供一个简单的示例:
@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
我知道这并不能真正回答您的问题,但是不同的View Engine具有不同的用途。在星火视图引擎,例如,目的是试图让一切流畅可读摆脱你的“标签汤”的观点。
最好的选择就是只看一些实现。如果它看起来很符合您的解决方案的意图,请尝试一下。您可以在MVC中混合和匹配视图引擎,因此,如果您决定不使用特定的引擎,这应该不是问题。
检查此SharpDOM。这是用于生成html和asp.net mvc视图引擎的ac#4.0内部dsl。
我认为此列表还应该包括每个视图引擎的示例,以便用户无需访问每个网站就可以了解每个视图引擎。
图片说出一千个单词,标记示例就像是视图引擎的屏幕截图:)所以这是我最喜欢的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>