Параметризованное включение в Classic ASP с VBScript - PullRequest
1 голос
/ 26 мая 2010

Я хочу написать функцию, которая будет включать внешний файл, очень похожий на Server.Execute, но будет передавать параметры. Мне известно, что Server.Execute будет передавать параметры query , но я бы хотел передать данные в более общем виде. Например:

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

' external.inc
Response.Write mykey

Я сомневаюсь, что смогу продвинуться достаточно далеко, не прочитав внешний штраф, не перевернув его и не выполнив, но я бы хотел подойти как можно ближе. Также, если это возможно, я бы предпочел не использовать опцию передачи запросов по соображениям безопасности.

EDIT:

Критерии, которые я хотел бы выполнить, если это возможно, следующие:

  1. Динамическое включение (т. Е. Без SSI)
  2. Простой синтаксис для вызова (предпочтительно один вызов функции)
  3. Простые включаемые файлы (только фрагменты HTML / ASP)
  4. Передача максимально возможного количества данных.

SSI подходит для 2, 3 и 4, и я бы использовал его в одно мгновение, за исключением того, что я не хочу жестко кодировать явные пути в мои файлы. Если я могу использовать механизм VBScript, я могу просто указать имя включаемого файла и заставить его найти его.

Чтение файла и его выполнение удовлетворят требованиям 1, 2 и 4. 3 нарушено, потому что вы не можете вставить прямой HTML во включаемый файл. Я использую этот подход для импорта сценариев, потому что мне не нужна эта возможность, но для фрагментов это просто необходимо.

Server.Execute имеет 1, 2 и 3, но единственный способ (AFAICT) для передачи включаемых данных - изменить строку запроса. Сохранение контекста выполнения вызывающей стороны невозможно.

Запись включаемых файлов как классов удовлетворяла бы 1, 2 и 4. В этом случае включаемые файлы были бы значительно усложнены.

Ответы [ 5 ]

1 голос
/ 21 апреля 2011

Извините, что докажу, что вы ошибаетесь, Bugeo, но форма Динамического / условного включения очень возможна;

Посмотрите на Thom WSC, это компоненты на основе XML, которые вы можете кодировать в vbscript и вызывать со страниц asp. Они действуют так, как если бы они были компонентами COM, но их можно редактировать и интерпретировать на лету, как обычные страницы ASP.

Они не очень известны в классическом ASP, но на самом деле они очень полезны и даже позволяют разделить представление и бизнес-логику. WSC также может вызывать другие WSC, чтобы вы могли программировать N-уровневое приложение.

В моем блоге есть пример, показывающий, как вызвать WSC из ASP. Есть также два WSC, которые вы можете скачать и изменить. Они на самом деле довольно простые, вы определяете свойства и методы в XML, и в одном и том же файле вы можете кодировать методы получения и установки для этих свойств, а также все ваши методы в 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

Надеюсь, это поможет,

Эрик

1 голос
/ 27 мая 2010

Используйте функцию или класс в вашем включении: -

'' # 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
0 голосов
/ 18 января 2017

Бьет меня как то, что считается «динамическим», когда все мои включаемые переменные передаются другим включениям на странице. Например, на каждой странице я использую

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

Тогда позже я могу использовать такие функции, как getUserName (UserID), чтобы отображать имя пользователя, где мне угодно.

При использовании куки-файла сеанса вся информация пользователя может быть доступна для регистрации и т. Д.

0 голосов
/ 19 июля 2011

Динамическое включение возможно в 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")))
%>
0 голосов
/ 30 октября 2010

Динамическое включение невозможно в классическом asp.

...