使用 ASPTemplate 分离代码和样式






4.83/5 (6投票s)
如何使用 ASP 模板分离代码和样式
背景
最近我不得不编写大量相当复杂的 ASP 代码来与数据库交互,并在格式精美的网页上呈现内容。众所周知,将 HTML 和 ASP 代码混杂在一个文件中是一件很痛苦的事情。一旦你需要更改代码逻辑或重新设计布局,那将更加痛苦。所以我开始寻找解决这个问题的方法。
我发现了很多不同的系统,有免费的也有商业的,但没有一个完全符合我的需求,所以我决定自己编写一个模板处理器。借助 IIS 5.0 或更高版本提供的 RegEx
对象,我得到了这个结果。
详细说明
负责这一切的是一个名为 ASPTemplate
的 VBScript 类。从现在开始,每个网页你将使用两个文件:一个只包含代码,另一个是纯 HTML。
ASPTemplate
类提供了两个你将在 HTML 模板中用于输入动态数据的机制:Slots
和 Blocks
。
Slot
是一个属性,它就像一个变量,会在 ASP 文件中渲染你赋给它的值。在 HTML 模板中使用它们时,将槽名放在双大括号之间(例如 {{Name}})。
Block
是一段 HTML,可以使用 ShowBlock
方法从 ASP 代码中显示或隐藏。Blocks
真正有用的地方在于它们可以使用 RepeatBlock
方法进行重复。每次调用此方法时,块的内容都会使用当前时刻的槽值进行重复。这样你就可以轻松方便地用数据库信息填充表格。
但等等,还有更多!Blocks
还可以嵌套到任意深度(尽管深度嵌套会显著增加处理时间),允许你用最少的代码创建非常复杂的结构。
如何使用 ASPTemplate
一个简单的例子可能会让你明白。如前所述,每个页面你将使用两个文件。这是第一个文件:
文件 Test.asp
这是代码文件,或者说是驱动文件。正如你所见,首先要做的就是包含 ASPTemplate.asp 文件并创建一个 ASPTemplate
对象实例。然后我们告诉对象使用哪个 HTML 模板。在这种情况下,它从默认目录 Templates/ 加载。如果需要,你可以使用 TemplateDir
属性更改它。
剩下的就是用一些变化的数据填充嵌套结构,这样你就可以看到它确实在起作用。注意,你可以像这样通过 QueryString
参数控制 Blocks
One
和 Two
:test.asp?Block=One。
所有 Blocks
默认都是隐藏的,并通过 ShowBlock
或 RepeatBlock
显示。在填充嵌套块的循环之前调用 ClearBlock
是必需的,以删除上一个循环的内容。
<!--#include file="ASPTemplate.asp" -->
<script language="VBScript" runat="Server">
dim t : set t = new ASPTemplate
t.Debug = false ' Set to true if you want to keep uninstantiated slots as text
t.Template = "test.html"
t.Slot("Title") = "This is a test"
t.Slot("Now") = Now()
t.Slot("Title") = t.Slot("Title") + " - and some more"
t.Slot("Test") = "Test text"
' Some random calculations to make up our test data
for i = 1 to 8
t.Slot("Cell1") = i
if t.Slot("Cell1") > 5 then t.Slot("Test") = t.Slot("Test") + " ..."
t.ClearBlock "Block1"
for j = 1 to i
t.Slot("Cell2") = i*j
t.ClearBlock "Block2"
for k = 1 to i-j+1
t.ClearBlock "Block3"
for l = 1 to 3
t.Slot("Cell3") = k+j*l+t.Slot("Cell2")
t.RepeatBlock "Block3"
next
t.RepeatBlock "Block2"
next
t.RepeatBlock "Block1"
next
t.RepeatBlock "TBody"
next
' Show Blocks named by query parameters. One and Two are available.
for each block in Request.QueryString("Block")
t.ShowBlock block, true
next
' Create and display the document
t.Generate
set t = nothing
</script>
文件 test.html
这就是模板文件的样子。代码/模板
二分的关键在于,模板文件可以使用所见即所得编辑器进行格式化,而无需切换到代码视图。
好吧,这可能不完全准确,因为块标记需要表示为 HTML 注释,因为它们往往出现在不能放置文本或常规 HTML 标签的地方。但大多数所见即所得编辑器可以显示注释为一个符号或类似的东西,所以布局人员仍然可以看到它们在哪里。
ASPTemplate
的另一个优点(演示中未显示)是,你可以根据某种条件或参数,从 .asp 文件切换到完全不同的模板,并且只要其他模板使用相同的槽和块结构,就不需要对 ASP 代码进行任何更改。是不是很棒?
<html>
<head>
<title>{{Title}}</title>
</head>
<body>
<p>This is a test. Here is the title <b>{{Title}}</b></p>
<p>This is now: {{Now}}</p>
<p>This is unused {{Nada}} more text.</p>
<!--#BeginBlock One--><p>This is block <b>One</b></p><!--#EndBlock One-->
<!--#BeginBlock Two--><p>This is block <b>Two</b></p><!--#EndBlock Two-->
<table border="1">
<tr>
<th width="70">Col 1</th>
<th>Col 2</th>
</tr>
<!--#BeginBlock TBody-->
<tr>
<td align="center">{{Cell1}}</td>
<td>
<table border="1">
<!--#BeginBlock Block1-->
<tr>
<td valign="top">{{Cell2}}</td>
<td><font size="2">
<!--#BeginBlock Block2-->
<i>{{Test}}</i>
<!--#BeginBlock Block3-->
{{Cell3}}!
<!--#EndBlock Block3-->
<!--#EndBlock Block2-->
</font>
</td>
</tr>
<!--#EndBlock Block1-->
</table>
</td>
</tr>
<!--#EndBlock TBody-->
</table>
</body>
</html>
杂项细节
ASPTemplate
的代码很大程度上依赖于 IIS 5.0 中引入的正则表达式对象。RegEx 对象的一个小问题是,捕获所有内容(.*
)不匹配换行符。我最初使用 (\n|.)*
来解决这个问题,这很有效,但速度很慢。所以我改为在读取模板文件后立即将所有换行符替换为单个空格。这使得后续处理速度大大加快。
我在 ASPTemplate.asp 文件中使用了紧凑的代码风格,注释不多,以保持文件体积小巧,但应该不难理解其工作原理。
注意事项
有人问过这个类的性能。就像所有模板处理器一样,它 *会* 拖慢速度——速度降低多少取决于你的使用方式。我没有对代码与纯 ASP 方法进行任何实际的基准测试。到目前为止,它的性能已经足够满足我的需求,尽管我可能不会推荐它用于任何高流量的网站。不过,如果你想尝试,请便。
历史
6/3 2002 | 第一个版本发布。 |
27/3 2002 | 将 Slot 改为使用属性而不是方法。这节省了代码中的变量,因为你可以像使用普通变量一样使用 Slot 。还更改了 ShowBlock ,使其根据布尔参数执行显示和隐藏。 |
所有问题和评论请直接发送给 Sven Axelsson(svenax@bredband.net)。