2009-01-26 46 views
7

我的意思是,像php'h包括...是否可以在asp-classic中發佈動態include?

 
my_file_to_be_included = "include_me.asp" 

-- > 

什麼我迄今所看到的,有幾個選擇,但他們每個人都有某種的缺點...

我想弄清楚的是如何製作一個靈活的模板系統......而不必將整個事件靜態地包含在單個文件中,並帶有loooooong case語句......

這裏有一對夫婦o ˚F鏈接

a solution using FileSysmemObject, just lets you include static pages

idem

yet another one

same thing from adobe

this approach uses Server.Execute

但是它有一些不足之處,我想避免...好像(避風港」 t試過)Server.Execute代碼運行在anoth呃背景下,所以你不能用它來加載功能您計劃在主叫用戶代碼中使用...討厭...

same thing

I think this one is the same

this looks promising!!!

我'我不確定它(還不能測試它),但它似乎像這個dinamycally處理頁面到SSDI組件...

任何想法???

+0

[4guysfromrolla(http://www.4guysfromrolla.com/)有着相當不錯的[文章](HTTP:// WWW。 4guysfromrolla.com/ASPScripts/PrintPage.asp?REF=%2Fwebtech%2F022504-1.shtml)。 – 2009-04-28 17:10:09

+0

您應該查看[ExecuteGlobal](http://msdn.microsoft.com/en-us/library/342311f1(VS.85).aspx)。請參見[使用ExecuteGlobal來包含VBScript代碼]中的示例3(http://www.gwmicro.com/Support/Knowledge_Base/?kbnumber=GWKB2035) – loraderon 2009-04-21 13:46:32

+0

儘管如此,Server.Execute在編寫動態模板系統時對我很好,因爲模板文件本身從未被期望添加新的功能/本身/。我確實必須將一個對象粘貼到Session var中才能將其傳遞給「included」文件。所以......長話短說,即使你從未得到過你想要的東西,你的問題對我也很有幫助。 :-) – 2017-10-03 18:22:20

回答

5

不,你不能做一個dyanmic包括,期間。

在這個你最好的拍攝是一個使用Server.Execute和傳遞的任何狀態通過會話變量需要: -

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

你可以做動態包含。看看下面的技術...... – atwrok8 2009-06-17 19:40:29

+0

@ atwrok8:我不認爲你已經正確理解了execute和include之間的區別。 – AnthonyWJones 2009-06-17 21:19:31

0

我在傳統的ASP有點生疏,但我敢肯定你可以使用Server.Execute方法讀入另一個asp頁面,然後繼續執行調用頁面。 15秒有一些basic stuff關於它 - 它把我帶回...

1

當然你可以做REAL classic asp dynamic includes。我之前寫過這篇文章,並以全新的方式爲我打開了經典ASP。儘管人們似乎認爲這是不可能的,但它會完全符合你的想法!

任何問題只是讓我知道。

0

我正在構建一個網站,它可以方便地使用動態包含。該網站是所有ajax(根本不需要重新加載頁面),而純數據JSON返回的調用不需要它,每個不同的應用程序子部分(窗口/窗格/區域/窗體等)的所有不同的html內容,對我來說最好是在不同的文件中。

我最初的想法是讓ajax調用返回到「中心樞紐」主文件(首先將應用程序關閉),然後該文件將知道要包含哪個子文件。只要包含所有文件,在我意識到每次調用一些可能很小的文件都必須解析整個站點的所有ASP代碼後纔可行!在速度和維護方面,使用Execute方法都不好。

我通過將假設的「孩子」頁面設置爲主頁面,並在每個頁面中包括「中心集線器」文件來解決問題。基本上,這是一個JavaScript的往返包括。

由於網頁的整體思想是服務器始終響應客戶端對「下一頁」的請求,因此這看起來成本較低。被請求的內容在被調用頁面的範圍內定義。

這樣做的唯一缺點是應用程序的「網頁片斷」必須部分分離:它們的大部分內容都在一個真實的.asp文件中,但它們的結構和關係已足夠在主體中定義。 asp文件(例如,一個web片段中的菜單項知道用來調用或加載另一個web片斷的名稱以及應該如何加載)。然而,從某種意義上說,與傳統網站相比,這仍然是一個優勢,每個網頁都必須知道如何加載其他網頁。現在,我可以執行諸如「加載這部分內容(無論是整頁還是其他部分)」的方式,以便想要加載「」。

我也設置它,所以每個部分可以有它自己的JavaScript和CSS(如果只有那部分需要這些東西)。然後,只有在第一次加載該部分時,纔會通過JavaScript動態地包含這些文件。然後,如果部件重複加載,則不會產生額外的開銷。

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"))) 
%> 
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 
相關問題