参数化包含在带有VBScript的Classic ASP中

时间:2010-05-26 16:24:05

标签: asp-classic vbscript include

我想编写一个包含外部文件的函数,就像Server.Execute一样,但会传递参数。我知道Server.Execute将传递查询参数,但我想更一般地传递​​数据。例如:

' main.asp
MyInclude("external.inc", Array("mykey", "myval"))

' external.inc
Response.Write mykey

我怀疑如果不阅读外部罚款,摆弄它并执行,我可以做得那么远,但我想尽可能地接近。另外,如果可能的话,出于安全原因,我宁愿避免使用查询传递选项。

编辑:

如果可能,我想要达到的标准是:

  1. 动态包含(即无SSI)
  2. 调用的简单语法(最好是单个函数调用)
  3. 简单包含文件(仅HTML / ASP代码段)
  4. 传递尽可能多的数据。
  5. SSI适合2,3和4,我会在心跳中使用它,除了我不想将显式路径硬编码到我的文件中。如果我可以使用VBScript的机制,我可以指定include的名称并让include函数找到它。

    读取文件并执行将满足1,2和4 3.因为您无法在包含中直接放置HTML。我使用这种方法导入脚本,因为我不需要这种能力,但是使用片段,这是必须的。

    Server.Execute有1,2和3,但传递包含数据的唯一方法(AFAICT)是查询字符串。保留调用者的执行上下文是不可能的。

    将包写为类将满足1,2和4.然后包含文件将变得更加复杂。

5 个答案:

答案 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的向导:

http://www.microsoft.com/downloads/en/details.aspx?familyid=408024ed-faad-4835-8e68-773ccc951a6b&displaylang=en

希望这有帮助,

埃里克

答案 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,所有用户的信息都可用于记录等。