我一直在 SO 和 Google 上搜索可用于 ASP.NET MVC 的各种视图引擎的细分,但除了简单的高级描述视图引擎是什么之外,我没有找到更多。
我不一定要寻找“最佳”或“最快”,而是在各种情况下对主要参与者(例如默认的 WebFormViewEngine、MvcContrib 视图引擎等)的优势/劣势进行一些现实世界的比较。我认为这对于确定从默认引擎切换是否对给定项目或开发组有利是非常有帮助的。
有没有人遇到过这样的比较?
我一直在 SO 和 Google 上搜索可用于 ASP.NET MVC 的各种视图引擎的细分,但除了简单的高级描述视图引擎是什么之外,我没有找到更多。
我不一定要寻找“最佳”或“最快”,而是在各种情况下对主要参与者(例如默认的 WebFormViewEngine、MvcContrib 视图引擎等)的优势/劣势进行一些现实世界的比较。我认为这对于确定从默认引擎切换是否对给定项目或开发组有利是非常有帮助的。
有没有人遇到过这样的比较?
由于似乎不存在完整的列表,因此让我们从 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>
<%}%>
设计目标:
优点:
缺点:
反例#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 是 .NET 平台上的Django 模板语言的实现,使用F# 语言。
优点:
WebFormViewEngine
设计目标:
Rails Haml 视图引擎的 .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)
设计目标:
优点:
缺点:
例子:
#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,当与网络助手一起使用时,它也非常强大。
提供一个简单的示例:
@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旨在通过尝试使所有内容流畅和易读来消除您对“标签汤”的看法。
你最好的选择是只看一些实现。如果它看起来很符合您的解决方案的意图,请尝试一下。您可以在 MVC 中混合和匹配视图引擎,因此如果您决定不使用特定引擎,这应该不是问题。
检查这个SharpDOM。这是用于生成 html 的 ac# 4.0 内部 dsl 以及 asp.net mvc 视图引擎。
我喜欢ndjango。它非常易于使用且非常灵活。您可以使用自定义标签和过滤器轻松扩展视图功能。我认为“与 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>