<style type="text/css">

我曾在《用ASP写一个支持自定义模板的数据记录输出函数》中写过一个支持自定义HTML模板显示数据库记录集(Recordset)的方法(函数),现在类推一下,写一个支持自定义HTML模板显示字典对象中的内容的方法(函数)。

这个方法(函数)接受4个参数,分别是:

  1. 一个字典对象
  2. 模板标签的头部
  3. 模板标签的重复项目部分
  4. 模板标签的底部

 

它返回用参数指定的头部、重复项目部分与底部拼接好完整HTML代码。

        ' 获取将字典对象中的内容以指定的模板显示出来的HTML代码
        Public Function GetDicListWithTemplate(ByRef oDictionary, ByRef sHeader, ByRef sRepeater, ByRef sFooter)
            Dim i, regEx, matches, repeater, j, aKeys, aItems
            
            'On Error Resume Next
            GetDicListWithTemplate = ""
            GetDicListWithTemplate = GetDicListWithTemplate & sHeader
            Set regEx = Server.CreateObject("VBScript.RegExp")
            Set matches = Nothing
            regEx.Global = True
            regEx.IgnoreCase = True
            
            '数据行
            If Count > 0 Then
                aKeys = oDictionary.Keys
                aItems = oDictionary.Items
                For i = 1 To Count
                    repeater = sRepeater
                    
                    ' 先替换掉<#= Keys #>标签
                    regEx.Pattern = "<#=\s*(Keys)\s*#>"
                    Set matches = regEx.Execute(sRepeater)
                    
                    For j = 0 To matches.Count - 1
                        If matches(j).SubMatches.Count > 0 Then
                            repeater = Replace(repeater, matches(j), aKeys(i-1))
                        Else
                            repeater = Replace(repeater, matches(j), "***")
                        End If
                    Next
                    
                    regEx.Pattern = "<#=\s*(Items)\s*#>"
                    Set matches = regEx.Execute(sRepeater)
                    
                    For j = 0 To matches.Count - 1
                        If matches(j).SubMatches.Count > 0 Then
                            repeater = Replace(repeater, matches(j), aItems(i-1))
                        Else
                            repeater = Replace(repeater, matches(j), "***")
                        End If
                    Next
                    
                    GetDicListWithTemplate = GetDicListWithTemplate & repeater
                Next
            End If
            
            If Not matches Is Nothing Then
                Set matches = Nothing
            End If
            Set regEx = Nothing
            GetDicListWithTemplate = GetDicListWithTemplate & sFooter
            
            On Error Goto 0
    End Function

使用示例:

如果我们将访问网站的在线的活跃用户信息保存在了一个字典对象里,用SessionID作为字典对象的键,而用另外的字符串比如用户名作为字典对象的值。那么,我们现在用一个列表将它显示出来,就可以如下这样写:

                            Dim sHeader, sRepeater, sFooter
                            
                            sHeader = "<div><table class=""tbLikeGoogle""><thead><tr><th>用户键值</th><th>用户标识</th></tr></thead><tbody>"
                            sRepeater = "<tr><td><#= Keys #></td><td><#= Items #></td></tr>"
                            sFooter = "</tbody></table></div>"
                            
                            Response.Write GetDicListWithTemplate(UserDictionary, sHeader, sRepeater, sFooter)

显示效果如下:

用户键值用户标识
389283182052
asdlkfjaskdfjsdafj

真是太方便啦!