11

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

到目前为止发布的原因:

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

4 回答 4

8

人们对语法感到不舒服的原因<% %>不是它包含很多语法盐,而是它使 Views以代码为中心,这可能与 MVC 使 Views 尽可能愚蠢的概念背道而驰。例如,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 窗体之上的语法糖。

于 2009-06-25T07:34:13.420 回答
2

从 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 标签和自定义代码标签可用于执行程序操作。这一切都允许 spark 最小化 naml 和 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 和 naml 将要求您进行上下文切换以执行 if..else 语句的代码。

参考

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

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

于 2009-06-25T14:06:57.683 回答
0

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

于 2009-06-24T21:37:42.690 回答
0

是的,请参阅.NET 的 HTML 生成器?

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

于 2011-02-01T22:09:33.307 回答