代码之家  ›  专栏  ›  技术社区  ›  Thom Smith

带vbscript的经典ASP中的参数化包含

  •  1
  • Thom Smith  · 技术社区  · 15 年前

    我想写一个包含外部文件的函数,很像server.execute,但会传递参数。我知道server.execute将传递 查询 参数,但我想更一般地传递数据。例如:

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

    我怀疑我能在不阅读外部罚款,旋转它,并执行的情况下走得这么远,但我想尽可能接近合理的。另外,如果可能的话,出于安全原因,我希望避免使用查询传递选项。

    编辑:

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

    1. 动态夹杂(即无SSI)
    2. 要调用的简单语法(最好是单个函数调用)
    3. 简单包含文件(仅HTML/ASP代码段)
    4. 尽可能多地传递数据。

    ssi适合2、3和4,我会在心跳中使用它,只是我不想将显式路径硬编码到我的文件中。如果我可以使用vbscript的机制,我只需指定include的名称并让include函数查找它。

    读取文件并执行将满足1、2和4。3被违反,因为您不能在include中直接放置html。我使用这种方法来导入脚本,因为我不需要这种能力,但是对于代码片段,这是必须具备的。

    execute有1、2和3,但传递include数据的唯一方法(afaict)是使用munge查询字符串。不可能保留调用方的执行上下文。

    编写includes-as类将满足1、2和4。然后,include文件将变得非常复杂。

    5 回复  |  直到 8 年前
        1
  •  1
  •   AnthonyWJones    15 年前

    使用include中的函数或类:

    '' # 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
    
        2
  •  1
  •   Erik Oosterwaal    14 年前

    很抱歉向您证明错误的bugeo,但是动态/条件包含的形式是非常可能的;

    看看wsc的thom,它们是基于XML的组件,您可以用vbscript编写代码并从ASP页面调用。它们的作用就像是COM组件,但是它们可以被编辑,并且可以像普通的ASP页面一样被动态地解释。

    它们在经典的ASP中并不广为人知,但实际上它们非常有用,甚至允许您分离表示和业务逻辑。一个WSC也可以调用其他的WSC,这样您就可以对一个n层应用程序进行编程。

    我的日志上有一个示例,演示如何从ASP调用WSC。您还可以下载和修改两个WSC。它们实际上非常简单,您可以用XML定义属性和方法,在同一个文件中,您可以为这些属性以及vbscript中的所有方法编写getter和setter代码:

    http://precompiled.wordpress.com/2007/11/26/hmac-sha1-encryptie-onder-classic-asp/

    以下是一些更详细的信息: http://aspalliance.com/414_Windows_Scripting_Components_WSC_in_ASP

    以及从Microsoft创建WSC的向导:

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

    希望这有帮助,

    埃里克

        3
  •  0
  •   Marco Staffoli    15 年前

    在经典的ASP中,动态包含是不可能的。

        4
  •  0
  •   tfi    14 年前

    动态包含在ASP Classic中是可能的:

    <%
     ' **** 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")))
    %>
    
        5
  •  0
  •   WilliamK    8 年前

    当我的所有include都将变量传递给页面中的其他include时,我被认为是“动态的”。例如,在我使用的每一页上

    <!--#include file="inc_common_functions.asp"-->
    

    然后,我可以使用getusername(userid)之类的函数,在任何需要的地方显示用户名。

    使用会话cookie,用户的所有信息都可以用于日志记录等。