65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASPTemplate 分离代码和样式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (6投票s)

2002年3月6日

公共领域

5分钟阅读

viewsIcon

140123

downloadIcon

1437

如何使用 ASP 模板分离代码和样式

背景

最近我不得不编写大量相当复杂的 ASP 代码来与数据库交互,并在格式精美的网页上呈现内容。众所周知,将 HTML 和 ASP 代码混杂在一个文件中是一件很痛苦的事情。一旦你需要更改代码逻辑或重新设计布局,那将更加痛苦。所以我开始寻找解决这个问题的方法。

我发现了很多不同的系统,有免费的也有商业的,但没有一个完全符合我的需求,所以我决定自己编写一个模板处理器。借助 IIS 5.0 或更高版本提供的 RegEx 对象,我得到了这个结果。

详细说明

负责这一切的是一个名为 ASPTemplate 的 VBScript 类。从现在开始,每个网页你将使用两个文件:一个只包含代码,另一个是纯 HTML。

ASPTemplate 类提供了两个你将在 HTML 模板中用于输入动态数据的机制:SlotsBlocks

Slot 是一个属性,它就像一个变量,会在 ASP 文件中渲染你赋给它的值。在 HTML 模板中使用它们时,将槽名放在双大括号之间(例如 {{Name}})。

Block 是一段 HTML,可以使用 ShowBlock 方法从 ASP 代码中显示或隐藏。Blocks 真正有用的地方在于它们可以使用 RepeatBlock 方法进行重复。每次调用此方法时,块的内容都会使用当前时刻的槽值进行重复。这样你就可以轻松方便地用数据库信息填充表格。

但等等,还有更多!Blocks 还可以嵌套到任意深度(尽管深度嵌套会显著增加处理时间),允许你用最少的代码创建非常复杂的结构。

如何使用 ASPTemplate

一个简单的例子可能会让你明白。如前所述,每个页面你将使用两个文件。这是第一个文件:

文件 Test.asp

这是代码文件,或者说是驱动文件。正如你所见,首先要做的就是包含 ASPTemplate.asp 文件并创建一个 ASPTemplate 对象实例。然后我们告诉对象使用哪个 HTML 模板。在这种情况下,它从默认目录 Templates/ 加载。如果需要,你可以使用 TemplateDir 属性更改它。

剩下的就是用一些变化的数据填充嵌套结构,这样你就可以看到它确实在起作用。注意,你可以像这样通过 QueryString 参数控制 Blocks OneTwotest.asp?Block=One

所有 Blocks 默认都是隐藏的,并通过 ShowBlockRepeatBlock 显示。在填充嵌套块的循环之前调用 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)。

© . All rights reserved.