我想编写一个包含外部文件的函数,就像Server.Execute一样,但会传递参数。我知道Server.Execute将传递查询参数,但我想更一般地传递数据。例如:
' main.asp
MyInclude("external.inc", Array("mykey", "myval"))
' external.inc
Response.Write mykey
我怀疑如果不阅读外部罚款,摆弄它并执行,我可以做得那么远,但我想尽可能地接近。另外,如果可能的话,出于安全原因,我宁愿避免使用查询传递选项。
编辑:
如果可能,我想要达到的标准是:
SSI适合2,3和4,我会在心跳中使用它,除了我不想将显式路径硬编码到我的文件中。如果我可以使用VBScript的机制,我可以指定include的名称并让include函数找到它。
读取文件并执行将满足1,2和4 3.因为您无法在包含中直接放置HTML。我使用这种方法导入脚本,因为我不需要这种能力,但是使用片段,这是必须的。
Server.Execute有1,2和3,但传递包含数据的唯一方法(AFAICT)是查询字符串。保留调用者的执行上下文是不可能的。
将包写为类将满足1,2和4.然后包含文件将变得更加复杂。
答案 0 :(得分:1)
使用包含中的函数或类: -
'' # main.asp
<!-- #include virtual="/myincludes/external.asp" -->
<%
External "myval"
%>
'' # external.asp
Function External(myval)
Response.Write myval
End Function
对于更复杂的场景,我倾向于使用一个类: -
'' # main.asp
<!-- #include virtual="/myincludes/external.asp" -->
<%
Dim external : Set external = CreateExternal("myval")
... some other code..
external.DoStuff
%>
'' # external.asp
Class External
Private myval
Public Sub Init(val)
myval = val
End Sub
Public Sub DoStuff()
Response.Write myval
End Sub
End Class
Function CreateExternal(mval)
Set CreateExternal = new External
CreateExternal.Init myval
End Function
答案 1 :(得分:1)
很抱歉为了证明你错了Bugeo,但很有可能采用动态/条件包含的形式;
看看WSC的Thom,它们是基于XML的组件,您可以在vbscript中编码并从asp页面调用。它们就好像它们是COM组件一样,但它们可以像普通的ASP页面一样进行编辑和解释。
它们在经典ASP中并不是很出名,但它们实际上非常有用,甚至允许您将表示和业务逻辑分开。 WSC也可以调用其他WSC,因此您可以编写N层应用程序。
我的博客上有一个示例,向您展示如何从ASP调用WSC。您还可以下载和修改两个WSC。它们实际上非常简单,您可以在XML中定义属性和方法,在同一个文件中,您可以为这些属性编写getter和setter,以及在vbscript中编写所有方法:
http://precompiled.wordpress.com/2007/11/26/hmac-sha1-encryptie-onder-classic-asp/
更详细的信息如下: http://aspalliance.com/414_Windows_Scripting_Components_WSC_in_ASP
微软创建WSC的向导:
希望这有帮助,
埃里克
答案 2 :(得分:0)
经典asp中无法实现动态包含。
答案 3 :(得分:0)
ASP经典中可以使用动态包含:
<%
' **** Dynamic ASP include v.2
function fixInclude(content)
out=""
if instr(content,"#include ")>0 then
response.write "Error: include directive not permitted!"
response.end
end if
content=replace(content,"<"&"%=","<"&"%response.write ")
pos1=instr(content,"<%")
pos2=instr(content,"%"& ">")
if pos1>0 then
before= mid(content,1,pos1-1)
before=replace(before,"""","""""")
before=replace(before,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""")
before=vbcrlf & "response.write """ & before & """" &vbcrlf
middle= mid(content,pos1+2,(pos2-pos1-2))
after=mid(content,pos2+2,len(content))
out=before & middle & fixInclude(after)
else
content=replace(content,"""","""""")
content=replace(content,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""")
out=vbcrlf & "response.write """ & content &""""
end if
fixInclude=out
end function
Function getMappedFileAsString(byVal strFilename)
Dim fso,td
Set fso = Server.CreateObject("Scripting.FilesystemObject")
Set ts = fso.OpenTextFile(Server.MapPath(strFilename), 1)
getMappedFileAsString = ts.ReadAll
ts.close
Set ts = nothing
Set fso = Nothing
End Function
execute (fixInclude(getMappedFileAsString("included.asp")))
%>
答案 4 :(得分:0)
当我将所有传递变量包含在页面中的其他包含中时,将我视为“动态”。例如,在我使用的每个页面上
<!--#include file="inc_common_functions.asp"-->
然后我可以使用getUserName(UserID)等函数在任何地方显示用户名。
使用会话cookie,所有用户的信息都可用于记录等。