台灣最大程式設計社群網站
線上人數
1496
 
會員總數:246141
討論主題:189725
歡迎您免費加入會員
討論區列表 >> ASP >> [ASP]有關動態Include檔案的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
[ASP]有關動態Include檔案的問題
價值 : 0 QP  點閱數:2227 回應數:11
樓主

maduka 版主
高級專家
9119 53
6734 2958
發送站內信

捐贈 VP 給 maduka
在下有個動態Include檔案的問題
由於Include的方式無法動態包含以變數指定的檔案
所以在下使用Server.Execute的方式將該包含檔Include進來
但是該Include檔案是一個副程式的集合檔
用Server.Execute的方式包含進來之後
就無法呼叫該檔案所包含的Function與Sub程序
不知道有沒有人遇到過相關的問題,能否提示一下?
謝謝~

搜尋相關Tags的文章: [ include ] ,
本篇文章發表於2002-08-21 13:17
1樓
回應

Tales
檢舉此回應
我以前有碰上過這個問題,
用判斷式吧,像這樣子:
main.asp
<%A = 1%>
<!--#include file="inc.asp"-->
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
</head>
<body>
<%=B%>
</body>
</html>

inc.asp
<%If A = 1 Then%>
<!--#include file="asp_1.asp"-->
<%Else%>
<!--#include file="asp_2.asp"-->
<%End If%>

asp_1.asp
<%B = "成功"%>

asp_2.asp
<%C = "失敗"%>

這是我以前在小正正的討論區問來的...
http://cpatch.org/alexwang/board/content.asp?ID=11818&VIP=0&Topic=%A8%CF%A5%CEServer%2EExecute%B9J%A8%EC%C5%DC%BC%C6%AA%BA%B0%DD%C3D

--
Server.Execute 是好方法,可是在執行上會被視作是不同的程式,函數與變數都無法共享,如果堅持要這麼做的話,也許可以考慮把這些東西做成物件,然後放在Session,
不過這好像不是什麼值得推薦的方法....
本篇文章回覆於2002-08-21 14:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

maduka
檢舉此回應
在下有試過這樣的方式
<%If A = 1 Then%>
<!--#include file="asp_1.asp"-->
<%Else%>
<!--#include file="asp_2.asp"-->
<%End If%>
但是不管如何
asp_1.asp,asp_2.asp都會被include進來耶
本篇文章回覆於2002-08-21 14:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Tales
檢舉此回應
我寫ASP是用Jscript啦,
我是這樣子用的:

switch(i{
case "aa":%>
<!-- #include file ="aa.inc">
<%;break;
case "bb":%>
<!-- #include file ="bb.inc">
<%;break;
case "cc":%>
<!-- #include file ="cc.inc" -->
<%;break;
case "dd":%>
<!-- #include file ="dd.inc" -->
<%;break;
};

我這樣,沒有被讓switch選到的就不會被include進來,我確定
不過這些 include file 敘述中所指向的檔案要真的存在!
不然的話就算沒有讓switch選到,一樣會出錯誤。
本篇文章回覆於2002-08-21 15:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

maduka
捐贈 VP 給 maduka 檢舉此回應
>不過這些 include file 敘述中所指向的檔案要真的存在!
>不然的話就算沒有讓switch選到,一樣會出錯誤。

那也就表示說
include file的優先權比ASP高ㄌ?
這樣的話,應該會在asp執行前,就將所有的檔案include進來ㄌ?

在下有作過一個測試
<%Select Case val%>
<%Case "1"%>
  <!--#include file="inc1.asp"-->
<%Case "2"%>
  <!--#include file="inc2.asp"-->
<%End Select%>
這樣作的話
會將兩個檔案都Include進來喔
不信的話可以試試
用這樣的方式,還是可以呼叫得到inc2.asp中的Function與Sub
本篇文章回覆於2002-08-21 16:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

song
檢舉此回應
...
*.asp中的#include指令的處理方式並不像真正的SSI指令,它只是1個ASP所認識的特殊的指令.它會送到ssinc.dll檔"分析"(Parse),然後產生真正的SSI的#include指令
....

以上也許跟您們討論的有關係
   
song..
本篇文章回覆於2002-08-21 17:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

Tales
檢舉此回應
>那也就表示說
>include file的優先權比ASP高ㄌ?
>這樣的話,應該會在asp執行前,就將所有的檔案include進來ㄌ?

我也覺得是你說的這樣,
不過我自己也試過,沒有被switch到的檔案裡頭的變數與物件,
確實也無法存取,函數也一樣,
也許這是VB與JS的差別吧?
本篇文章回覆於2002-08-21 20:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

redhair
檢舉此回應
ASP執行的步驟是
(1)先解析整個檔案一遍,在這時後會把所include的檔案內容
copy 進來
(2)第二步才是執行script command
也就是 include動作在先,然後才會去解譯程式
這就是為何無法態使用include file,跟用VBScript or JScript無關

假如用if..else or select case..的條件式來動態include案是可行的
但在第一步驟時會把所有被include files都先被copy進來,所以才會有
下列現像:
>>"不過這些 include file 敘述中所指向的檔案要真的存在!
>>不然的話就算沒有讓switch選到,一樣會出錯誤。"

所以這會造成server的效能大幅降低,因為在條件式中不須要的code
都先被copy進來也被解譯一次,所也建議你include那些一定會被執行
的程式, 另外一些util function也僅量切割成不同的files,只include必需
的function就好了.所以ASp 3.0 才會提供server.execute來提高效能.
如果只在單機或個人網站上.是顯現不出差異,但如果在大型商業網站
效能是一個非常重要的指標.

本篇文章回覆於2002-08-22 05:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Tales
檢舉此回應
謝謝 redhair ...
我想順便問一下,那不用 switch + include ,有沒有別的方式隨機載入某一個 function
本篇文章回覆於2002-08-22 22:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

redhair
檢舉此回應
補充說明一
ASP在第一步解析過程中,除了會把include file的內容copy進來外,還會解析自訂函數
(Function),這樣在第二步解譯執行時,呼叫函數才會作用,所以雖然ASP script是由上
而下循序執行,但是你自訂函數可放在程式的任何地方,甚至最下面,都可以叫它,因為它
已經在第一步驟就定義好了.
所以假設有兩個include檔inc1.asp & inc2.asp
inc1.asp之內容
<%response.write "inc1"
  function func1()
  end function
%>

inc2.asp之內容
<%response.write "inc2"
  function func2()
  end function
%>

原始程式為:==================================
<%If xxx then%>
   <!-- #include file="inc1.asp" -->
<%else%>
   <!-- #include file="inc2.asp" -->
<%end if%>

第一步解析後================================
程式便為下面這樣的,且func1 跟 func2已定義好了
<%If xxx then%>
   <%response.write "inc1"
     function func1()
     end function
    %>
<%else%>
   <%response.write "inc2"
     function func2()
     end function
   %>
<%end if%>

第二步解譯執行階段時,條件是只能控制 response.write "inc1"
跟 response.write "inc2",函數定義已在第一階段完成,不受執行
執行階段條件式控制,所以在程式中呼叫func1跟func2都可作用.
所以如果動態include 自訂函數及副程式是沒意義的,而且只是增加
server的負擔.
本篇文章回覆於2002-08-23 16:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

redhair
檢舉此回應
可否說說為何你需要動態載入function,或許可以討論一下

但是一般來說動態include檔案,都是html或是馬上要執行的script,
如果要動態include一些副程式或自訂函數進來,等待其他程式來呼叫的話,
這種方法不太正確,原因如下:
(1)前面提過,你所include的file都會先被copy進來,不管你的條件式為何,
然後再被解譯一次,所以跟你把所有檔案合在一起,一次include進來相比,
你的程式還多了一次條件判斷,等於又增加server的負擔
(2)假如你動態include兩個files,裡面各有一個函數func1 and func2,
那你的程式也要動態條件式去判斷要跑哪個function,結果又多了一次條件
判斷,這樣還不如一次就載入func1 and func2,這樣只要用一次判斷來決定
呼叫哪個function
(3)假如你動態include兩個files, file1 and file2 裡面各有一個同名的function
叫func, 結果 func 會變成後面以後面被include的那一個,所以動態include也沒意義,
因為不管條件式為何,func永遠被最後一個所定義.
而且這樣會提高日後除錯及修改的困難度,因為每個檔案中都有同名的函數.
本篇文章回覆於2002-08-23 16:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

redhair
檢舉此回應
補充說明二
如果在程式中定義多個同名的函數,結果這個自訂函數會變為最下面
那一個函數,因為在第一步解析階段也是從上往下解析,自然會以最下面
那個自訂函數取代所有同名的函數

所以假設有兩個include檔inc1.asp & inc2.asp
inc1.asp之內容
<%
  function func1()
      response.write "inc1"
  end function
%>

inc2.asp之內容
<%
  function func1()
     response.write "inc2"
  end function
%>

原始程式為:==================================
<%If xxx then%>
   <!-- #include file="inc1.asp" -->
<%else%>
   <!-- #include file="inc2.asp" -->
<%end if%>

第一步解析後================================
程式便為下面這樣的,且func1 已定義好了,而且是變為後面那個func1()

<%If xxx then%>
   <%
     function func1()
        response.write "inc1"
     end function
    %>
<%else%>
   <%
     function func1()
        response.write "inc2"
     end function
   %>
<%end if%>

第二步解譯執行階段時,如果你呼叫func1()
結果為
     function func1()
        response.write "inc2"
     end function
本篇文章回覆於2002-08-23 16:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.