首页 文章

ASP.NET MVC视图引擎比较

提问于
浏览
335

我一直在SO和Google上搜索可用于ASP.NET MVC的各种视图引擎的细分,但是没有找到比视图引擎的简单高级描述更多的内容 .

我不一定在寻找“最佳”或“最快”,而是在各种情况下对主要参与者(例如默认的WebFormViewEngine,MvcContrib View Engines等)的优缺点进行实际比较 . 我认为这对确定从默认引擎切换是否对给定项目或开发组有利有用 .

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

6 回答

  • 18

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

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


    System.Web.Mvc.WebFormViewEngine

    设计目标:

    一个视图引擎,用于将Web窗体页面呈现给响应 .

    优点:

    • 无处不在,因为它附带ASP.NET MVC

    • 熟悉ASP.NET开发人员的经验

    • 智能感知

    • 可以使用CodeDom提供程序选择任何语言(例如C#,VB.NET,F#,Boo,Nemerle)

    • 按需编译或precompiled视图

    缺点:

    • 用法因"classic ASP.NET"模式的存在而混淆,这些模式不再适用于MVC(例如ViewState PostBack)

    • 可以促成"tag soup"的反模式

    • 代码块语法和强类型可能会妨碍

    • IntelliSense强制执行的样式并不总是适用于内联代码块
      设计简单模板时

    • 可能会有噪音

    例:

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

    设计目标:

    优点:

    • 紧凑,富有表现力和流畅性

    • 易于学习

    • 不是一种新语言

    • 有很棒的智力感知

    • 单元可测试

    • 无处不在,附带ASP.NET MVC

    缺点:

    • 从上面引用的"tag soup"创建一个稍微不同的问题 . 服务器标签实际上提供了服务器和非服务器代码周围的结构,Razor混淆了HTML和服务器代码,使得纯HTML或JS开发具有挑战性(参见Con Example#1),因为您最终必须使用"escape" HTML和/或JavaScript标签某些非常常见的情况 .

    • 封装可重用性差:将剃刀模板称为普通方法是不切实际的 - 实际上razor可以调用代码但反之亦然,这可能会鼓励代码和表示混合 .

    • 语法非常面向html;生成非HTML内容可能会很棘手 . 尽管如此,razor的数据模型基本上只是字符串连接,因此语法和嵌套错误既不是静态也不是动态检测,尽管VS.NET设计时有助于缓解这种情况 . 由此可维护性和可重构性可能受到影响 .

    • 没有记录的API,http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

    例#1(注意“string [] ...”的位置):

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

    Bellevue

    设计目标:

    尊重HTML作为一流的语言而不是将其视为“只是文本” . 不要乱用我的HTML!数据绑定代码(Bellevue代码)应与HTML分开 . 实施严格的模型 - 视图分离


    Brail

    设计目标:

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

    优点:

    在"wrist-friendly python syntax"之后

    • 建模

    • 按需编译视图(但没有预编译可用)

    缺点:

    • 旨在用Boo语言编写

    例:

    <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文字而不是大多数其他视图引擎的字符串 .

    优点:

    • 有效XML的编译时检查

    • 语法着色

    • 全智能感知

    • 编译的视图

    • 使用常规CLR类,函数等的可扩展性

    • 无缝可组合性和操作,因为它是常规的VB.NET代码

    • 单位可测试

    缺点:

    • 性能:在将整个DOM发送到客户端之前构建它 .

    例:

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

    NDjango

    设计目标:

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

    优点:


    NHaml

    设计目标:

    Rails Haml视图引擎的.NET端口 . 来自Haml网站:Haml是一种标记语言,用于干净简单地描述任何Web文档的XHTML,而不使用内联代码...... Haml避免了将XHTML显式编码到模板中的需要,因为它实际上是XHTML的抽象描述,用一些代码生成动态内容 .

    优点:

    • 简洁结构(即D.R.Y.)

    • 缩进

    • 结构清晰

    • C# Intellisense(适用于没有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)

    设计目标:

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

    优点:

    • 易于读/写

    • 简洁的视图代码

    缺点:

    • 视图上可用的辅助方法数量有限

    • 不会自动进行Visual Studio集成(IntelliSense,视图的编译时检查或重构)

    例:

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

    SharpTiles

    设计目标:

    SharpTiles是JSTL的部分端口,结合了Tiles框架背后的概念(从Mile stone 1开始) .

    优点:

    _999_熟悉Java开发人员

    • XML样式的代码块

    缺点:

    • ......

    例:

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

    Spark View Engine

    设计目标:

    这个想法是允许html控制流程和代码以无缝地适应 .

    优点:

    • 生成更易读的模板

    • C# Intellisense(对于没有ReSharper的VS2008)
      209 SparkSense plug-in for VS2010(与ReSharper配合使用)

    • 提供强大的Bindings feature来摆脱视图中的所有代码,并允许您轻松发明自己的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 View Engine MVC

    设计目标:

    轻量级 . 没有创建页面类 . 快速 . 模板将写入响应输出流 . 缓存 . 模板已缓存,但使用FileSystemWatcher检测文件更改 . 动态 . 可以在代码中动态生成模板 . 灵活 . 模板可以嵌套到任何级别 . 符合MVC原则 . 促进UI和业务逻辑的分离 . 所有数据都是提前创建的,并传递给模板 .

    优点:

    • 熟悉StringTemplate Java开发人员

    缺点:


    Wing Beats

    Wing Beats是用于创建XHTML的内部DSL . 它基于F#并包含ASP.NET MVC视图引擎,但也可以单独用于创建XHTML的功能 .

    优点:

    • 有效XML的编译时检查

    • 语法着色

    • 全智能感知

    • 编译的视图

    • 使用常规CLR类,函数等的可扩展性

    • 无缝可组合性和操作,因为它是常规的F#代码

    • 单位可测试

    缺点:

    • 您并不真正编写HTML,而是在DSL中表示HTML的代码 .

    XsltViewEngine (MvcContrib)

    设计目标:

    从熟悉的XSLT构建视图

    优点:

    • 无处不在
      适用于XML开发人员的

    • 熟悉的模板语言

    • 基于XML

    • 经过时间考验

    • 可以静态检测语法和元素嵌套错误 .

    缺点:

    • 功能语言风格使流量控制变得困难

    • XSLT 2.0(可能?)不受支持 . (XSLT 1.0不太实用) .


  • 9

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

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

    我目前的选择是剃刀 . 它非常干净,易于阅读,并使视图页面易于维护 . 还有intellisense支持,这真的很棒 . ALO,当与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

  • 5

    我知道这并没有真正回答你的问题,但不同的View引擎有不同的用途 . 例如,Spark View Engine旨在通过尝试使一切流畅和可读来摆脱您对"tag soup"的看法 .

    你最好的选择就是看一些实现 . 如果它看起来对您的解决方案的意图很有吸引力,请尝试一下 . 您可以在MVC中混合和匹配视图引擎,因此如果您决定不使用特定引擎,则不应该成为问题 .

  • 11

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

  • 4

    我喜欢ndjango . 它非常易于使用且非常灵活 . 您可以使用自定义标记和过滤器轻松扩展视图功能 . 我认为"greatly tied to F#"比缺点更有优势 .

相关问题