5

I am playing with ASP.NET MVC and I see that there are a few alternate view engines available for it such as NHaml and Spark. My question is why would you use an alternate view engine? I don't see a benefit to having something like this:

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

using the Spark view engine (doubly so since, and I haven't used Spark to verify this and might be totally wrong, you wouldn't get Intellisense since you're passing the code as a string) and:

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

using the built-in ASP.NET MVC template format (although I admit the dangling curly brace is pretty ugly). Is there any legitimate reason apart from not like the "gator" tags (or dangling curly braces) to consider using an alternate view engine? Or is it just cool because it's something new?

4

5 回答 5

5

试着让它更复杂一点:

<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 < products.Count; i++) { Product product = products[i]; .... } 这些日子?您更喜欢 foreach (var product in products) {} 吗?我会。不仅因为打字少。因为:

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

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

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

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

于 2009-11-19T21:55:19.233 回答
2

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

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

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

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

于 2009-11-11T23:39:40.480 回答
1

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

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

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

于 2009-11-11T23:31:16.240 回答
1

我会说这更像是一种选择。这就像在 C# 和 Visual Basic 之间做出选择,使用您最了解的以及您将更有效率的东西。

于 2009-11-12T00:03:44.177 回答
0

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

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

我不喜欢的:

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

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

于 2009-11-11T23:58:57.867 回答