我看过了常见的选择...Spark、NHaml等,它们似乎都是为那些不熟悉 <% %> 语法的人提供的语法糖。除此之外,还有其他实际的好处吗?对我来说,语法糖并不足以成为更换整个视图引擎的充分理由。
迄今为止发布的原因:
- 更容易从不同平台过渡
- 更自然的上下文切换
- 更好的关注点分离
- 代码行数更少
- 更好的抵抗跨站脚本攻击
- 更好的 XHTML 兼容性
我看过了常见的选择...Spark、NHaml等,它们似乎都是为那些不熟悉 <% %> 语法的人提供的语法糖。除此之外,还有其他实际的好处吗?对我来说,语法糖并不足以成为更换整个视图引擎的充分理由。
迄今为止发布的原因:
<% %>
语法感到不舒服的原因并不是它包含了大量的语法盐,而是它使得视图变得代码中心化,这可能违背了MVC概念中让视图尽可能愚笨的理念。例如,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>
从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 view (665 chars)
<%@ 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>
默认情况下(通过配置),对所有内容进行html编码以避免XSS
XHTML兼容输出
<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和nhaml来执行if..else语句,你需要进行上下文切换。
参考资料
[http://code.google.com/p/nhaml/wiki/NHamlLanguageReference]
是的,请查看.NET的HTML生成器?
您希望在普通C#代码中具有相同的重构能力。它是代码,因此您希望能够以相同的方式对其进行结构化。使用继承、组合、参数、循环、递归等。