【问题标题】:Parameterized include in Classic ASP with VBScript带有 VBScript 的经典 ASP 中的参数化包含
【发布时间】:2010-05-26 16:24:05
【问题描述】:

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

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

' external.inc
Response.Write mykey

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

编辑:

如果可能的话,我希望满足的条件是:

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

SSI 适合 2、3 和 4,我会在心跳中使用它,但我不想将显式路径硬编码到我的文件中。如果我可以使用 VBScript 的机制,我可以指定包含的名称并让包含函数找到它。

读取文件并执行将满足 1、2 和 4。违反了 3,因为您不能将直接 HTML 放入包含中。我使用这种方法来导入脚本,因为我不需要那种能力,但是使用 sn-ps,它是必须的。

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

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

【问题讨论】:

  • 也许我没有得到您真正想要的东西,但听起来您应该将 inc 功能放入 COM 组件或创建 Web 服务。

标签: asp-classic vbscript include


【解决方案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

【讨论】:

  • 这符合我最初的问题,但我的动机是摆脱 SSI。 +1,问题扩大到澄清。
【解决方案2】:

很抱歉证明你错了 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

还有一个来自 Microsoft 的向导来创建 WSC:

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

希望这会有所帮助,

埃里克

【讨论】:

  • WSC 对于包含库很有用,但据我所知,它们不会让您转储混合的 HTML/ASP 代码——只是脚本。老实说,它们看起来就像我已经在使用的导入系统,除了 XML 行噪音。模块私有变量很好,但我已经可以伪造它们了。
  • 嗨 Thom,使用 WSC 符合您的所有标准,WSC 是有条件的包含。您可以有条件地从 asp 中调用它们,这与始终包含的 SSI 不同。我不知道你的确切目标是什么,但你可以实例化一个 WSC 对象,调用它的函数或设置它的属性,传入你想要的任何变量类型。如果 WSC 文件本身是一个简单的文件有待讨论,但调用它并传入数据非常简单。
  • WSC 没有通过标准 3,它指定了 HTML/ASP sn-ps。 WSC 很好,但它们根本不包含我需要包含的数据类型。
  • 嗨 Thom,我不确定你所说的 sn-ps 是什么意思,但你可以轻松地做这样的事情:dim myArray : myArray = Array("mykey", "myval") dim includes set includes = GetObject("script:"&amp;Server.MapPath("/includes.wsc")) includes.WriteHeader(myArray) includes.WriteMenu(myArray) includes.WriteFooter(myArray) set myIncludes = nothing(不知道为什么,但换行不起作用......让我知道是否应该邮寄给您)
  • wsc 中的@Rico 你能像调用 ASP 一样打开和关闭脚本标签吗?例如:'一些asp代码%>

    这里的html

【解决方案3】:

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

【讨论】:

    【解决方案4】:

    在 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")))
    %>
    

    【讨论】:

      【解决方案5】:

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

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

      然后我可以使用 getUserName(UserID) 之类的函数在任何我喜欢的地方显示用户名。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        相关资源
        最近更新 更多