我正在使用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”标签(或悬挂花括号)以考虑使用备用视图引擎?或者它是否很酷,因为它是新的东西?
答案 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产品){}吗?我会。不仅因为打字更少。这是因为:
这就像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的一些好处(我喜欢):
我不喜欢的事情:
我Spark解决了这个问题,我认为没有理由使用标准视图引擎。