请问asp中的自定义标签是怎么自定义
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问asp中的自定义标签是怎么自定义相关的知识,希望对你有一定的参考价值。
请问asp中的自定义标签是怎么自定义的,请举个例子说详细点它的标签像$Web_SiteName$这样的,比如:一个asp文件包涵<title>$Web_SiteName$</title>,那么$Web_SiteName$又是怎么怎么定义.
希望能给一个完整的例子!谢谢! 能教会我的另有加分!
请不要在网上随便复制一段过来!网上的好多我都看了,但是看不明白!
给个例子的话,我勉强根据经验描述一个常用的例子,当然标签也不完全是用于模板的,比如新闻系统中,我们定义两个模板,A用于游戏新闻;B用于行业动态:
主要分为两大步骤:
1,定义模板和标签。
<%
'为了简单起见,我们把模板存在数据库中,也可以用fso生成模板文件。
'上一步可以提交一个编辑模板的表单,则使用TStr=request("Tempelt")
'这里为了节约字数,我就直接定义成字符串
TitleStr="<title>$title$</title>" '定义文章标题标签
'细心点你会发现为什么用这么奇怪的字符串:$title$,其实就是为了防止实际的标题中也出现同样的字符串,那么后面的替换就会出错
InfoStr="<title>$Info$</title>" '定义文章内容标签
'两个字符产分别描述了两个模板,根据实际替换“用于美化模板的代码”部分,就成了两个不同风格的模板了。
Tstr1="...用于美化模板的代码"&TitleStr&"...用于美化模板的代码"&InfoStr&"...用于美化模板的代码"
Tstr2="...用于美化模板的代码"&TitleStr&"...用于美化模板的代码"&InfoStr&"...用于美化模板的代码"
.......将两个模板分别存到数据库(假设tList表)中(tContent1,tContent2字段),代码就省略了。
%>
2,使用标签和模板
<%
.........读取模板数据(如果是fso文件,则参看文件操作读取数据,效果是一样的),假设获取的数据集是tRs
'实际使用中大部分情况是,表单提交的,比如:新闻标题rTitle,新闻信息rInfo,新闻类别rClass
cTitle=request("rTitle")
cInfo=request("rInfo")
cClass=request("rClass")
'注意关键的使用,就是把提交过来的内容从模板中替换调
if cClass="游戏新闻" then
'这里$Title$就是我们定义的标签,cTitle是实际提交的标题
ShowStr=replace(tRs("tContent1"), "$Title$",cTitle)
ShowStr=replace(tRs("tContent1"), "$Info$",cInfo)
end if
if cClass="行业动态" then
'使用另一个模板
ShowStr=replace(tRs("tContent2"), "$Title$",cTitle)
ShowStr=replace(tRs("tContent2"), "$Info$",cInfo)
end if
'最后,如果这里是个显示新闻的页面,我们只需要输出就可以了
response.write ShowStr
%>
最后,为什么要如此麻烦地使用标签呢?
其实最常用的还是为了解决程序扩展性的问题。经常会遇到,网站根据不同性质的内容要使用不同风格的页面显示,如果有足够的程序员和美工的人力资源的完全可以把程序从头改一遍就行了。但这样做明显成本高昂,且修改后不能保证程序的稳定。于是就产生了标签,模板的应用,我们可以随时任意地更改模板的风格(DW,记事本什么的只需要注意定义标签的位置就可以了),任意地选择新闻显示时用的模板,一劳永逸。
PS:我上面的例子只是范例,实际中大部分是应用在转静态的,所以使用FSO生成文件的可能性更大,而且更复杂的功能很多时候还会用调用的函数(过程)返回值来替换标签,以实现更强大的功能,但原理是一样的。 参考技术A 摘要:这不是一个新话题了,无论是asp还是asp.net,谁都想实现真正的数据和显示分离。今天下午弄了一下,实现了这个效果。大概过程就是美工人员来制作模板,然后模板里面可以使用一些自定义标签,最后由程序来加载模板并输出实际的加了内容的页面。比如说下面的自定义标签
<tag:loop channelid="17" pagesize="10" title="10" elite="false" column="2"/>就表示
文章栏目ID为17,共显示10条记录,每条记录最多显示10个字符,不比是精华,分两栏显示。本文章演示的是原理,根据这个原理可以实现更复杂的模板。
一、定义模板
template.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>模板</title>
</head>
<body>
<table width="600" border="0" style="border:1px solid blue; font-size:12px">
<tr>
<td>文章栏目ID为17,共显示10条记录,每条记录最多显示10个字符,不比是精华,分两栏显示</td>
</tr>
<tr>
<td style="border:1px solid red; font-size:12px; "><tag:loop channelid="17" pagesize="10" title="10" elite="false" column="2"/></td>
</tr>
</table>
<br>
<table width="600" border="0" style="border:1px solid blue; font-size:12px">
<tr>
<td>文章栏目ID为23,共显示8条记录,每条记录最多显示10个字符,不必是精华,不两栏显示</td>
</tr>
<tr>
<td style="border:1px solid red; font-size:12px; "><tag:loop channelid="23" pagesize="8" title="10" elite="false" column="1"/></td>
</tr>
</table>
</body>
</html>
二、处理模板
Default.asp
'【功能】处理自定义模板标签
Function ProcessCustomTags()Function ProcessCustomTags(ByVal sContent)
Dim objRegEx, Match, Matches
'建立正则表达式
Set objRegEx = New RegExp
'查找内容
objRegEx.Pattern = "<tag:[^<>]+?\/>"
'忽略大小写
objRegEx.IgnoreCase = True
'全局查找
objRegEx.Global = True
'Run the search against the content string we've been passed
Set Matches = objRegEx.Execute(sContent)
'循环已发现的匹配
For Each Match in Matches
'Replace each match with the appropriate HTML from our ParseTag function
sContent = Replace(sContent, Match.Value, ParseTag(Match.Value))
Next
'消毁对象
set Matches = nothing
set objRegEx = nothing
'返回值
ProcessCustomTags = sContent
End Function
'【功能】取得模板标签的参数名
'如:<tag:loop channelid="1" pagesize="10" title="20" type="NEW" column="1">
Function GetAttribute()function GetAttribute(ByVal strAttribute, ByVal strTag)
Dim objRegEx, Matches
'建立正则表达式
Set objRegEx = New RegExp
'查找内容 (the attribute name followed by double quotes etc)
objRegEx.Pattern = lCase(strAttribute) & "=""[0-9a-zA-Z]*"""
'忽略大小写
objRegEx.IgnoreCase = True
'全局查找
objRegEx.Global = True
'执行搜索
Set Matches = objRegEx.Execute(strTag)
'如有匹配的则返回值, 不然返回空值
if Matches.Count > 0 then
GetAttribute = Split(Matches(0).Value,"""")(1)
else
GetAttribute = ""
end if
'消毁对象
set Matches = nothing
set objRegEx = nothing
end function
'【功能】解析并替换相应的模板标签内容
Function ParseTag()function ParseTag(ByVal strTag)
dim arrResult, ClassName, arrAttributes, sTemp, i, objClass
'如果标签是空的则退出函数
if len(strTag) = 0 then exit function
'Split the match on the colon character (:)
arrResult = Split(strTag, ":")
'Split the second item of the resulting array on the space character, to
'retrieve the name of the class
ClassName = Split(arrResult(1), " ")(0)
'Use a select case statement to work out which class we're dealing with
'and therefore which properties to populate etc
select case uCase(ClassName)
'It's a loop class, so instantiate one and get it's properties
case "LOOP"
set objClass = new WawaLoop
objClass.Channelid= GetAttribute("channelid", strTag)
objClass.Pagesize= GetAttribute("pagesize", strTag)
objClass.title = GetAttribute("title", strTag)
objClass.Elite = GetAttribute("elite", strTag)
ParseTag =objClass.column (GetAttribute("column", strTag))
set objClass = nothing
end select
end function
'【功能】实际替换标签的类
Class WawaLoopClass WawaLoop
public Channelid,Pagesize,title,Elite,conn
Private Sub Class_Initialize()Sub Class_Initialize()
dim connstr
dim db
db="wawa.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
conn.Open connstr
End Sub
Public Function column()Function column(strColumn)
dim i,rs,sql,strtemp
i = 1
strtemp = strtemp& "<table width=100% border=0>"
strtemp = strtemp&"<tr>"
set rs=server.CreateObject("adodb.recordset")
sql = "select top "&Pagesize&" * from article where classid="&Channelid&" and Elite="&Elite&""
rs.open sql,conn,1,1
do while not rs.eof
strtemp = strtemp& "<td valign=top>" &lefttrue(rs("title"),title) & "</td>"
if (i mod strColumn) =0 then
strtemp = strtemp& "</tr><tr>"
end if
rs.movenext
i=i+1
loop
rs.close:set rs = nothing
strtemp = strtemp& "</table>"
column = strtemp
End Function
End Class
’【功能】截断字符串的一个函数
Function LeftTrue()Function LeftTrue(str,n)
If len(str)<=n/2 Then
LeftTrue=str
Else
Dim TStr
Dim l,t,c
Dim i
l=len(str)
TStr=""
t=0
for i=1 to l
c=asc(mid(str,i,1))
If c<0 then c=c+65536
If c>255 then
t=t+2
Else
t=t+1
End If
If t>n Then exit for
TStr=TStr&(mid(str,i,1))
next
LeftTrue = TStr & ""
End If
End Function
Function ReadAllTextFile()Function ReadAllTextFile
Const ForReading = 1
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(Server.MapPath("template.htm"), ForReading)
ReadAllTextFile = f.ReadAll
End Function
'最后输出模板转换后的代码
response.write ProcessCustomTags(ReadAllTextFile)
三、最终效果
小节:这里演示的语法是ASP的,你几乎可以不加修改的转换为vb.net代码,呵呵,几乎就是修改一下FSO能力。根据这个原理,你就可以写一个支持多种模板和皮肤的网站了。虽然我们在前期开发的时候可能得费一些力气来编码,但这是值得的。 参考技术B 用的是替换。
如你建一个模板文件,如 skin.html
文件内容为:
标题:$title$
内容:$content$
再建立一个asp文件,如: view.asp
内容如下:
<%
title="这是标题变量"
content="这是内容变量"
'用fso打开模板文件
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objCountFile = objFSO.OpenTextFile(Server.MapPath("skin.html"))
FSOFileRead = objCountFile.ReadAll '这样就读取出skin.html里的内容了。
objCountFile.Close
Set objCountFile=Nothing
Set objFSO = Nothing
'我们再把读取到的模板文件进行替换,
html=replace(FSOFileRead,"$title$",title) '把skin.html里的$title$替换成title变量
html=replace(html,"$content$",content) '把skin.html里的$content$替换成content变量
response.write html '输出结果
%>
到此结束,运行一下view.asp就可以看到结果了。
多试几次吧,呵。 参考技术C 这些标签其实可以随便写,想写成什么都可以的,并没有什么规则,
这种标签一般用于模板,有两种,一种用fso读取模板,另一种是用xmlhttp读取,
fso方法就是把模板文件做成一个.htm文件,然后用fso来读取该文件的代码,
然后再把模板代码中的各标签用Replace来替换成对应的内容,比如:
code =replace(code, "$网站标题$", "欢乐谷")
不过如果模板中需要执行一些asp代码的话,就无能为力了。
所以有人想到把模板文件做成asp文件,然后通过xmlhttp来读取这个asp模板文件,
这样模板中的asp代码就会被执行,增强了模板的重用性。
这些标签实际上没有什么太大的意义,只不过是放进去先占个位置,让后面的程序能够在指定的位置替换入指定的内容。 参考技术D 这个是一个标签阿,用于生成静态页面的。在生成静态页面的时候先读取模板,然后用程序中的相关字段来替换这些自定义的标签。然后写文件。生成相应需要的页面
Django Formset 中的自定义标签
【中文标题】Django Formset 中的自定义标签【英文标题】:Custom Label in Django Formset 【发布时间】:2011-08-22 10:13:15 【问题描述】:如何将自定义标签添加到我的表单集?
<form method="post" action="">
formset.management_form
% for form in formset %
% for field in form %
field.label_tag : field
% endfor %
% endfor %
</form>
我的模型是:
class Sing(models.Model):
song = models.CharField(max_length = 50)
band = models.CharField(max_length = 50)
现在在模板中而不是字段标签为'song'
,我如何设置它以使其显示为'What song are you going to sing?'
?
【问题讨论】:
“自定义标签”是什么意思?他们应该怎么看?它们应该显示在哪里?那个模板提取有什么意义? 抱歉不清楚。查看编辑? 【参考方案1】:您可以在表单中使用label
参数:
class MySingForm(forms.Form):
song = forms.CharField(label='What song are you going to sing?')
...
如果您使用的是ModelForms
:
class MySingForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MySingForm, self).__init__(*args, **kwargs)
self.fields['song'].label = 'What song are you going to sing?'
class Meta:
model = Sing
更新:
(@Daniel Roseman 的评论)
或者在模型中(使用verbose_name
):
class Sing(models.Model):
song = models.CharField(verbose_name='What song are you going to sing?',
max_length=50)
...
或
class Sing(models.Model):
song = models.CharField('What song are you going to sing?', max_length=50)
...
【讨论】:
我收到TypeError: __init__() got an unexpected keyword argument 'label'
label
应该是 verbose_name
,或者只使用第一个位置参数。
答案已更新。 label
参数仅用于 Form
字段而不是 Model
字段(我的错误)。您能否发布您的表单定义,以便我可以为您提供 100% 可行的解决方案?
我使用的是 ModelForm class SingForm(ModelForm): Class Meta: model = Sing
在模型字段中使用verbose_name
的解决方案应该可以解决问题。以上是关于请问asp中的自定义标签是怎么自定义的主要内容,如果未能解决你的问题,请参考以下文章