使用备用视图引擎有什么好处?

时间:2009-11-11 23:18:15

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

我正在使用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”标签(或悬挂花括号)以考虑使用备用视图引擎?或者它是否很酷,因为它是新的东西?

5 个答案:

答案 0 :(得分: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提供了许多功能 - 宏(你在火花标记中编写你的Html.Helpers代码),PDF导出等 - 由其他人列出 - 但作为程序员,我更喜欢干净的代码。

另一个例子,你经常用于(int i = 0; i&lt; products.Count; i ++){Product product = products [i]; .... } 这些日子?你更喜欢foreach(产品中的var产品){}吗?我会。不仅因为打字更少。这是因为:

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

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

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

更新:嗯,还有另一个编辑......移动ASP的if / span里面的li ...

答案 1 :(得分:2)

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

我之所以选择spark是因为我希望看起来更清晰,我还希望用它来为除HTML之外的其他东西创建模板。我目前使用它来生成XML,JSON和电子邮件模板,因此它成为我和视图引擎的模板引擎。这是可能的,因为它允许您将视图渲染到字符串,而这在标准视图引擎中是不容易的。

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

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

答案 2 :(得分:1)

就个人而言,我不使用备用视图引擎,但它们的吸引力在于更清晰的视图。如果你能熟练使用Spark,那么第一个例子就更好更容易阅读。

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

这些视图引擎主要是来自其他框架(如RoR和Django)的结转。 Django对其视图模板系统的论证是视图应用于视图逻辑。因此,如果限制视图引擎中的可能性,则控制器和视图之间的职责混合的机会就会减少。

答案 3 :(得分:1)

我认为它更像是一种选择而不是其他任何选择。这就像在C#和Visual Basic之间做出决定一样,使用你最了解的内容以及你将更有效率的内容。

答案 4 :(得分:0)

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

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

    1. Intellisense和Resharper存在问题。
    2. 无法使用格式文档选项。
    3. 我Spark解决了这个问题,我认为没有理由使用标准视图引擎。