【问题标题】:What are the benefits of using an alternate view engine?使用备用视图引擎有什么好处?
【发布时间】:2009-11-11 23:18:14
【问题描述】:

我正在使用 ASP.NET MVC,我发现有一些替代视图引擎可供它使用,例如 NHaml 和 Spark。我的问题是为什么您会使用备用视图引擎?我不认为拥有这样的东西有什么好处:

<ul if="products.Any()">
    <li each="var p in products">${p.Name}</li>
</ul>
<else>
    <p>No products available</p>
</else>

使用 Spark 视图引擎(双倍如此,我没有使用 Spark 来验证这一点并且可能完全错误,因为您将代码作为字符串传递,所以您不会得到 Intellisense)并且:

<% if products.Any() { %>
    <ul>
      <% foreach (var p in products) { %>
        <li><%= p.Name %></li>
      <% } %>  
    </ul>
<% } else { %>
    <p>No products available</p>
<% } %>

使用内置的 ASP.NET MVC 模板格式(虽然我承认悬空的花括号很丑)。除了不喜欢“gator”标签(或悬挂的花括号)之外,还有什么正当理由考虑使用备用视图引擎?还是只是因为它是新事物而很酷?

【问题讨论】:

  • 我认为答案是嵌入问题中的(不,我从未使用过spark,但我想我会在看到这个比较后尝试一下)。

标签: asp.net-mvc spark-view-engine viewengine


【解决方案1】:

试着让它更复杂一点:

<div if="orders.Any()" each="var order in orders">
  Here's your order #${orderIndex+1}:
  <ul>
    <li each="var p in order.Products">
       ${pIndex}: ${p.Name}
       <span if="pIsLast"> (the end)</span>
    </li>
  </ul>
</div>

我可以看到这里的流程。我实际上可以在这里看到 HTML。现在看看:

<% if (orders.Any()) { %>
  <% var orderIndex = 0; foreach (var order in orders") { %>
   <div>
    Here's your order #<%= (orderIndex+1) %>
    <ul>
      <% int pIndex = 0; foreach (var p in order.Products) 
         { bool pIsLast = pIndex == products.Count; %>
        <li>
           <%= pIndex %>: <%= p.Name %>
           <% if (pIsLast) { %>
              <span> (the end)</span>
           <% } %>
        </li>
      <% ++ pIndex; } %>  
    </ul>
   </div>
  <% orderIndex++; } %>
<% } %>

我迷路了。那里有 HTML 吗?

对我来说,这是主要原因。当然,Spark 提供了很多功能 - 宏(您在 spark 标记中编写 Html.Helpers 代码)、PDF 导出等 - 由其他人列出 - 但作为程序员,我更喜欢干净的代码。

再举一个例子,你是否经常使用 for (int i = 0; i

  • 它更好地表达了意图
  • 读起来更好
  • 它隐藏了我疲惫的头脑中的其他详细信息(如 .Count、.Length 或 .Count();或者如果它是 IEnumerable,您必须以特殊方式遍历)
  • 它减少了使上下文混乱(以及我疲惫的头脑)的变量数量
  • 这样我就可以集中精力解决问题,没有任何障碍
  • 它有助于避免 {},因为内部不需要有变量 - 减少行数
  • 当您将集合从 IList 更改为数组时,您不会到处更改 50 个循环

这就是 foreach 这样简单的事情。每个原因都很简单,但它们总结起来更重要。这些理由完全适用于 Spark。嘿,看来我恋爱了;-)

更新:现在,你知道吗?看看我帖子的编辑历史。我不得不多次编辑该死的 ASP 代码,因为我在这里和那里遗漏了一些内容。我只是看不出是对还是错。如果我在那里有跨度,或者在适当的条件下,它完全隐藏

更新:嗯,又一个编辑...将 ASP 的 if/span 移动到 li...

【讨论】:

    【解决方案2】:

    我认为您需要问的问题是“为什么要更改视图引擎”而不是“我应该更改视图引擎”

    我选择 spark 是因为我想要看起来更干净的视图,并且我还想用它来为 HTML 以外的东西创建模板。我目前使用它来生成 XML、JSON 和电子邮件模板,因此它已成为我的模板引擎和视图引擎。这之所以成为可能,是因为它允许您将视图呈现为字符串,而这在标准视图引擎中(很容易)不可用。

    还需要注意的是,您也不必使用单一视图引擎。您可以同时使用多个引擎,因此您可以将默认视图引擎用于 HTML 模板,但切换到用于 XML 的 spark。

    总体而言,如果默认视图引擎可以满足您的所有需求并且您对此感到满意,那么我根本不会费心切换,但是如果您有默认视图引擎无法满足的特定需求,那么也许是时候看看替代品了。

    【讨论】:

      【解决方案3】:

      就我个人而言,我不使用替代视图引擎,但它们的吸引力在于更清晰的视图。如果您精通 Spark,那么第一个示例会更好,也更容易阅读。

      但是,我更喜欢将诸如您提供的逻辑包装到辅助方法中。我不需要学习新东西,我所有的同事都能理解,我的观点也相对干净。这是一个完全主观的问题,任何一种方法都可以。

      这些视图引擎很大程度上是从 RoR 和 Django 等其他框架继承而来的。 Django 对其视图模板系统的论点是视图应该用于视图逻辑。因此,如果您限制视图引擎中的可能内容,您在控制器和视图之间混淆职责的机会就会减少。

      【讨论】:

        【解决方案4】:

        我会说它比其他任何东西都更多。这就像在 C# 和 Visual Basic 之间做出选择,使用您最了解的以及您将更有效率的东西。

        【讨论】:

          【解决方案5】:

          Spark 的一些好处(我喜欢的):

          1. 您可以使用部分视图,例如 html 标记。使用示例可以是圆角的标记。
          2. 你没有得到“标签汤”。也许你现在看不到好处,但如果你有大量的观点,它的可读性会好得多。
          3. 您可以获得对 ViewData["..."] 的强类型访问权限。
          4. 您可以轻松地将视图呈现为字符串。
          5. 自动应用 Html.Encode,提高应用程序的安全性。

          我不喜欢的:

          1. Intellisense 和 Resharper 存在问题。
          2. 无法使用“格式化文档”选项。

          我的 Spark 已经解决了这个问题,我认为没有理由使用标准视图引擎。

          【讨论】:

          • asp.net 4.0 有新的编码标签,在 MVC 2.0 中可以使用: 默认开启编码。如果你使用 David Ebbo 的 t4 模板,你可以在任何地方获得智能感知,包括视图数据,你可以通过部分视图获得大量代码分离
          • 我使用 VS2008 和 ASP.NET 3.5,我不想使用与之兼容的标签和引擎。
          • 您是否尝试过在任何编辑器(例如 Notepad++)中将文档格式化为 HTML?甚至重命名为 .html - 格式 - 重命名为 .spark?我认为应该这样做,因为 Spark 是一种 HTML ;-)
          • @queen3:我尝试在 VS 中使用 XML 编辑器并在那里进行格式化。那效果不好。 C# 代码格式很差,使用起来不太舒服。
          • 好吧,如果你有 # 代码,这可能是个问题(虽然它不适合我);但我的大多数观点都没有。而且我刚刚尝试过格式化为 XML 和 HTML,它们都可以生成干净但略有不同的结果。现在,我还可以使用 Notepad++ 的 HtmlTidy 选项成功格式化 - 这为配置提供了很大的灵活性。它也可以毫无问题地处理#代码。如果你的视图中有那么多 C# 代码,那么你最好把它移到别处,无论如何;-)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-19
          相关资源
          最近更新 更多