是否有可能在asp-classic中发布动态包含?

时间:2009-01-26 11:38:47

标签: asp-classic include template-engine

我的意思是,就像php'h包括......

类似

my_file_to_be_included = "include_me.asp"

-- >

就目前为止我所看到的,有几种选择,但每一种都有某种缺点...

我想弄清楚的是如何制作一个灵活的模板系统......而不必将整个事物静态地包含在一个带有loooooong案例陈述的单个文件中......

这里有几个链接

a solution using FileSysmemObject, just lets you include static pages

idem

yet another one

same thing from adobe

this approach uses Server.Execute

但它有一些我想避免的缺点...似乎(尚未尝试)Server.Execute代码在另一个上下文中运行,因此您无法使用它来加载您计划的功能在呼叫者代码中使用...讨厌......

same thing

I think this one is the same

this looks promising!!!

我不确定(暂时无法测试)但似乎这个dinamycally处理页面到SSDI组件......

任何想法???

6 个答案:

答案 0 :(得分:6)

不,你不能做一个动态包含,期间。

你最好的注意是server.execute并通过Session变量传递它需要的任何状态: -

Session("callParams") = BuildMyParams() 'Creates some sort of string
Server.Execute(my_file_to_be_included)
Session.Contents.Remove("callParams")

答案 1 :(得分:2)

改进版(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")))
%>

答案 2 :(得分:1)

当然可以REAL classic asp dynamic includes。我写了一段时间后,它以一种全新的方式为我打开了经典ASP。尽管人们似乎认为这是不可能的,但它将完全符合您的要求!

任何问题都让我知道。

答案 3 :(得分:0)

我在经典ASP上有点生疏,但我很确定你可以使用Server.Execute方法读取另一个asp页面,然后继续执行调用页面。 15秒有一些basic stuff关于它 - 它让我回来......

答案 4 :(得分:0)

我正在建立一个能够使用动态包含的网站。该网站都是ajax(根本没有页面重新加载),而纯数据JSON返回调用不需要它,每个不同的应用程序子部分(窗口/窗格/区域/窗体等)的所有不同的html内容对我来说,最好是在不同的文件中。

我最初的想法是让ajax调用回到“中心集线器”主文件(首先关闭应用程序),然后知道要包含哪个子文件。在我意识到每次调用一些可能很小的部分后,只需包含所有文件就无法解决整个网站的所有ASP代码!在速度和维护方面,使用Execute方法并不好。

我通过将所谓的“子”页面作为主页面来解决问题,并在每个页面中包含“中心集线器”文件。基本上,这是一个javascript往返包括。

这比看起来更便宜,因为网页的整体想法是服务器始终响应客户端对“下一页”的请求。正在请求的内容由被调用的页面在范围内定义。

唯一的缺点是应用程序的“Web部分”必须部分拆分:它们的大部分内容都在一个真正命名的.asp文件中,但是在主.asp中定义了足够的结构和关系文件(例如,一个网页中的菜单项知道用于调用或加载另一个网页的名称以及应该如何加载)。但是,在某种程度上,这仍然优于传统网站,每个网页都必须知道如何加载其他每个网页。现在,我可以做“加载这部分(无论是整页还是其他部分)想要加载的方式”。

我也设置了它,所以每个部分都可以拥有自己的javascript和css(如果只有那部分需要那些东西)。然后,只有在第一次加载该部分时,才会通过javascript动态包含这些文件。然后,如果重复加载零件,则不会产生额外的开销。

答案 5 :(得分:0)

仅作为补充说明。我在使用动态包含的页面顶部得到了奇怪的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