можно ли оформить динамическое включение в asp-classic? - PullRequest
7 голосов
/ 26 января 2009

Я имею в виду, что php'h включает ...

что-то вроде

my_file_to_be_included = "include_me.asp"

-- >

за то, что я видел до сих пор, есть пара альтернатив, но у каждого из них есть какой-то недостаток ...

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

здесь есть пара ссылок

решение, использующее FileSysmemObject, просто позволяет включать статические страницы

Мет

еще один

То же самое из Adobe

этот подход использует Server.Execute

но у него есть некоторые недостатки, которых я бы хотел избежать ... похоже (еще не пробовал) код Server.Execute выполняется в другом контексте, поэтому его нельзя использовать для загрузки функций, которые вы планируете использовать в коде звонящего ... противный ...

то же самое

Я думаю, что это то же самое

это выглядит многообещающе !!!

Я не уверен в этом (пока не смог протестировать), но похоже, что этот динамически обрабатывает страницу как компонент SSDI ...

есть идеи ???

Ответы [ 6 ]

6 голосов
/ 26 января 2009

Нет, вы не можете включить динамическое включение, точка.

Ваш лучший выстрел в этом - это server.execute и передача любого необходимого состояния через переменную Session: -

Session("callParams") = BuildMyParams() 'Creates some sort of string
Server.Execute(my_file_to_be_included)
Session.Contents.Remove("callParams")
2 голосов
/ 19 июля 2011

Улучшенная версия (v2.0):

<%
' **** Dynamic ASP include v.2.0

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")))
%>
1 голос
/ 17 июня 2009

Конечно, вы можете сделать РЕАЛЬНАЯ классическая динамика asp включает . Я написал это некоторое время назад, и это открыло для меня Classic ASP совершенно по-новому. Он будет делать именно то, что вам нужно, даже если люди думают, что это невозможно!

Любые проблемы, просто дайте мне знать.

0 голосов
/ 07 июня 2013

Просто в качестве дополнительной заметки. Я получал странные символы ASCII в верхней части страниц, которые использовали динамические включения, поэтому я обнаружил, что использование объекта ADODB.Stream для чтения файла включения устраняет эту проблему.

Итак, мой обновленный код для функции getMappedFileAsString выглядит следующим образом

Function getMappedFileAsString(byVal strFilename)
  Dim fso
  Set fso = CreateObject("ADODB.Stream")

  fso.CharSet = "utf-8"
  fso.Open
  fso.LoadFromFile(Server.MapPath(strFilename))

  getMappedFileAsString = fso.ReadText()

  'Response.write(getMappedFileAsString)
  'Response.End

  Set fso = Nothing
End Function
0 голосов
/ 19 октября 2010

Я создаю веб-сайт, на котором было бы удобно использовать динамические включения. Сайт полностью ajax (без перезагрузки страницы), и хотя вызовы, возвращающие JSON с чистыми данными, не нужны, все различное html-содержимое для каждой отдельной части приложения (окно / панель / область / форма и т. Д.) мне кажется, лучше всего быть в разных файлах.

Моя первоначальная идея состояла в том, чтобы вернуть вызов ajax к главному файлу «центрального концентратора» (который в первую очередь запускает приложение), который затем знал бы, какой подфайл следует включить. Простое включение всех файлов стало невозможным после того, как я понял, что каждый вызов какого-то крошечного фрагмента должен был бы анализировать весь код ASP для всего сайта! И использование метода Execute не было хорошим, как с точки зрения скорости, так и с точки зрения обслуживания.

Я решил проблему, сделав предполагаемые «дочерние» страницы главными, и включив в них файл «центральный концентратор». По сути, это Javascript туда и обратно.

Это дешевле, чем кажется, так как вся идея веб-страницы заключается в том, что сервер постоянно отвечает на запросы клиентов о "следующей странице". Запрашиваемый контент определяется по объему вызываемой страницей.

Единственным недостатком этого является то, что «веб-части» приложения должны жить частично разделенными: большая часть их содержимого находится в реальном именованном файле .asp, но достаточно их структуры и взаимосвязи, определенной в основном .asp. файл (чтобы, например, пункт меню в одной веб-части знал имя, используемое для вызова или загрузки другой веб-части, и как должна выполняться эта загрузка). В некотором смысле, это все же преимущество по сравнению с традиционным сайтом, где каждая страница должна знать, как загрузить любую другую страницу. Теперь я могу делать такие вещи, как «загрузить эту часть (целую страницу или нет) так, как она хочет, чтобы была загружена».

Я также настроил его так, чтобы каждая часть могла иметь свой собственный javascript и css (если только эта часть нуждается в этих вещах). Затем эти файлы включаются динамически через JavaScript только при первой загрузке этой части. Тогда, если деталь загружается повторно, это не повлечет за собой дополнительных затрат.

0 голосов
/ 26 января 2009

Я немного устала от классического ASP, но я почти уверена, что вы можете использовать метод Server.Execute для чтения на другой странице asp, а затем продолжить выполнение вызывающей страницы. 15 Секунды имели некоторые базовые вещи об этом - это возвращает меня ...

...