问题 使用备用ASP.NET MVC视图引擎有什么好处?


我看过常见的嫌疑人...... Spark,NHaml等。对于那些对<%%>语法感到不舒服的人来说,它们似乎都是语法糖。还有其他有形的好处吗?在我看来,句法糖并不是改变整个视图引擎的充分理由。

到目前为止发布的原因:

  1. 更容易从不同的平台过渡
  2. 更自然的上下文切换
  3. 更好地分离关注点
  4. 更少的代码行
  5. 更好地抵制跨站点脚本
  6. 更好的XHTML合规性

6667
2018-06-24 21:08


起源

接受bzlm的回答,因为更无缝代码的概念似乎是核心思想。但是,对我来说最重要的是loudej的评论。 - Robert Harvey♦
是的,“避免<%}}%>清道夫狩猎”是单独放弃<%%>语法的原因。 :) - bzlm


答案:


人们之所以对此感到不舒服 <% %> 语法不是它包含很多语法盐,而是它包含了视图 代码为中心,这可能违背MVC概念,使视图尽可能愚蠢。例如,Spark的目标是“去 允许html支配流量 和代码无缝契合“。因此,实际的好处是让它更容易遵循MVC的精神。

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

如果上面只是语法糖,那么ASP.NET MVC本身就是ASP.NET Web Forms之上的语法糖。


8
2018-06-25 07:34



在您的示例中,p.Name仍然被注入视图(或多或少),就像在asp.net mvc的标准引擎中一样,除了使用$ {}而不是尖括号和百分号。这有什么不同? - Robert Harvey♦
说ASP.NET视图是语法糖,而不是整个ASP.NET MVC会更准确。 ASP.NET MVC包含的远不止于此。 - Robert Harvey♦
实际上,我认为我比nHaml更喜欢这个。它仍然看起来像ASP.NET MVC,但它将代码语句折叠为声明性HTML属性。 C#是否都支持这种方式? :) - Robert Harvey♦
几乎。 “可以使用CSharp代码生成输出。可以使用任何辅助方法,对象属性或计算为非空值的表达式”。 sparkviewengine.com/book/export/html/4 - bzlm
给糖多于空卡路里的东西就是每个=“”和if =“”的范围与元素的开始和结束标签相关联。由于你的html格式正确,你的代码也是如此,避免了<%}}%>清道夫狩猎。当你看得更远时,有更多的功能,但在七行中,这给你一个非常合理的第一印象。 - loudej


从nhaml的角度来看

  • 使观点更简洁

Nhaml视图(274个字符)

%h2= ViewData.CategoryName
%ul
  - foreach (var product in ViewData.Products)
    %li
      = product.ProductName 
      .editlink
        = Html.ActionLink("Edit", new { Action="Edit" ID=product.ProductID })
= Html.ActionLink("Add New Product", new { Action="New" })

aspx视图(665个字符)

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="List.aspx" Inherits="MvcApplication5.Views.Products.List" Title="Products" %>
<asp:Content ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
  <h2><%= ViewData.CategoryName %></h2>
  <ul>
    <% foreach (var product in ViewData.Products) { %>
      <li>
        <%= product.ProductName %> 
        <div class="editlink">
          (<%= Html.ActionLink("Edit", new { Action="Edit", ID=product.ProductID })%>)
        </div>
      </li>
    <% } %>
  </ul>
  <%= Html.ActionLink("Add New Product", new { Action="New" }) %>
</asp:Content>

它通过一系列速记字符来实现。在此处查看完整列表[http://code.google.com/p/nhaml/wiki/NHamlLanguageReference]

  • 部分和布局

更好看这里[http://code.google.com/p/nhaml/wiki/PartialsAndLayouts]

  • htmlencoding默认(通过配置)为所有内容避免XSS

  • 符合XHTML的输出

从火花的角度来看

  • 嵌入代码到xml标签和自定义代码标签可用于执行progromattic动作。这一切都允许spark最小化nhaml和aspx发生的上下文切换。

例如这个火花

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

aspx和nhaml会要求你做一个上下文来代码来执行if..else语句。

参考

[http://code.google.com/p/nhaml/wiki/NHamlLanguageReference]

[http://sparkviewengine.com/documentation/syntax]


2
2018-06-25 14:06



它确实看起来更简洁。但是,只有那些在F#中开发的人才能熟悉缩进的要求。 - Robert Harvey♦
如何在nHaml中指定继承?在默认视图引擎中,它被指定为Inherits =“MvcApplication5.Views.Products.List” - Robert Harvey♦
此外,您提供的视图是一个示例,似乎是从ASP.NET页面派生的。一些字符,如AutoEventWireUp,CodeBehind和Runat = Server是无偿的(它们不在ASP.NET MVC中使用)。 - Robert Harvey♦


句法糖 以什么方式?那么你可以学习另一种语法吗?不。这些引擎对于从其他平台迁移的开发人员非常有用。让他们的生活更轻松。


0
2018-06-24 21:37



究竟怎么样?.... - Robert Harvey♦
我认为Rob正在谈论在其他框架/平台中使用mvc模式的人。例如RubyRails上的haml和Castle Monorail中的nvelocity。他们可以过渡到类似于他们习惯的视图引擎的东西。 - Simon
我认为Rob提出了我的观点。对于已经在ASP.NET MVC中的人,像我一样,这不会是一个好处。 - Robert Harvey♦
但我可以看到它对于那些已经熟悉语法的人来说非常有价值。 - Robert Harvey♦
好吧,使用StringTemplate视图引擎对于任何想要严格执行模型/视图分离以及一般MVC模式的人来说非常有用。它不一定是过渡或迁移。 websitelogic.net/articles/MVC/... - bzlm


是的,看 用于.NET的HTML生成器?

您希望在普通的c#代码中具有相同的可重构性。它是代码,因此您希望能够以相同的方式构造它。使用继承,组合,参数,循环,递归等。


0
2018-02-01 22:09