2011-11-30 199 views
6

可以通過server.execute傳遞參數嗎?通過server.execute傳遞參數?

Fx。我在我的site.asp中有一個IF方案,我需要執行functions.asp?a=something&id=123。這可能嗎?!

在site.asp:

dim id 
id = 123 

if b = "hi" then 
    server.execute("functions.asp?a=something&id=" & id) 
else 
    response.write("No way dude") 
end if 

在functions.asp

a = request.querystring("a") 
id = request.querystring("id") 

if a = "something" and cint(id) > 100 then 
    response.write("Yes way dude") 
else 
    response.write("No way dude") 
end if 
+0

當你運行你的代碼時會發生什麼? –

+0

Serverobject錯誤'ASP 0173:80004005'MapPath方法中參數路徑中的字符無效---或者類似的,它在我的屏幕上是丹麥語:) – Behrens

+0

如果沒有查詢字符串參數,那麼會發生什麼? –

回答

5

不能在Server.Execute使用查詢字符串,它顯然在official documentation提及。

你可以做的是更好的:你可以直接訪問 site.asp定義裏面 functions.asp變量 id,你也可以申報,並設置另一個變量, a

--site.asp:

dim id, a 
id = 123 
a = "something" 
server.execute("functions.asp") 

--functions.asp

if a = "something" and cint(id) > 100 then 
    response.write("Yes way dude") 
else 
    response.write("No way dude") 
end if 

因爲它創造了全新的「腳本環境」的執行文件將無法訪問調用代碼的屬性,方法或變量,只有全局請求參數,會話等

考慮到這一點,我怕身邊最簡單的方法是使用會話變量傳遞頁面之間的值:

Session("id") = 123 
Session("a") = "something" 

然後:

if Session("a") = "something" and Session("id") > 100 then 
    response.write("Yes way dude") 
else 
    response.write("No way dude") 
end if 
+0

這就是我的想法。但它根本不起作用。我嘗試過使用唯一的變量名來確保變量不被覆蓋。但事實並非如此。 – Behrens

+0

難道是因爲它是server.execute內的server.execute嗎? – Behrens

+0

你的意思是「不起作用」?你得到了什麼確切的錯誤?從來沒有試過嵌套的'Server.Execute',但看不到任何原因,它不會工作。 –

3

這個問題可能是舊的和解決,但最好的答案沒有提及的一切,並有Microsoft.com上清楚地公佈有關它的信息:


Server.Execute Method

下列集合和屬性可用於執行的ASP頁面:

  1. Application變量,即使它們在呼叫頁面中設置。
  2. 會話屬性,即使它們在調用頁面中設置。
  3. 服務器變量和屬性,即使它們在調用頁面中設置。
  4. 請求集合和屬性,即使它們設置在調用頁面中。這包括表格查詢字符串傳遞給調用頁面的數據。
  5. 響應集合和屬性。執行的.asp文件可能會修改HTTP標頭。但是,與任何.asp文件一樣,如果執行的.asp文件在向客戶端發送響應後嘗試修改HTTP標頭,則會生成錯誤。

因此,大家可以看到,有5種方法,微軟建議通過一個Server.Execute方法傳遞變量。在我看到微軟之前,首選的方法是Session,正如最好的答案所表明的那樣,因爲我在Microsoft.com上的信息之前看到了這一點。但在注意到QueryStrings可以通過前一頁傳遞後,我不得不說這使用Session來傳遞值。如果您的應用程序需要您向執行頁面添加變量,則需要使用Session

但是,通過變量,我會說QueryStrings,如果您的應用程序允許靈活性,它很容易申請。我敢肯定,你知道如何已經使用查詢字符串,但在使用了一段Server.Execute方法的意義,你可以簡單地這樣做:

考慮讓ASP1.aspASP2.asp

ASP1.asp包括:

Server.Execute("ASP2.asp") 

ASP2.asp包括:

Response.Write Request("id") 

當你調用ASP1.asp?id=123 您會注意到ASP2.asp也看到了與ASP1.asp一樣的Querystring,所以它會在ASP1.asp的響應中寫入123

這比使用Session完成任務複雜得多。

0

簡而言之:是的,您可以在ASP.NET頁面或應用程序中將QueryString值與Server.Execute結合使用。

可以通過動態變量在執行ASPX頁(page1.aspx這個)組裝通過查詢字符串參數,如下所示:

Dim intExample1 As Int = 22 
    Dim strExample2 As String = "hello world" 
    Server.Execute("page2.aspx?number=" & intExample1 & "&string=" & Server.UrlEncode(strExample2)) 

在這個例子中,可以page2.aspx然後引用和使用下列值:

Request.QueryString("number") 
    Request.QueryString("string") 
+0

錯誤,OP詢問'經典asp'。 'asp' <>'aspx'。就IIS而言,整個其他的引擎。 – frumbert

0

爲什麼不使用#include而不是server.execute

我找了一個差異,發現在這種特殊情況下,使用#include是最好的解決辦法: https://en.wikibooks.org/wiki/Active_Server_Pages/Server-Side_Includes#What_it_Does

需要在父頁面定義一些變量來在孩子使用,所以您的解決方案可能是:

dim id, a 
id = 123 
a = "something" 
if b = "hi" then 
    <!--#include file="functions.asp" --> 
else 
    response.write("No way dude") 
end if 

在functions.asp

if a = "something" and cint(id) > 100 then 
response.write("Yes way dude") 
else 
    response.write("No way dude") 
end if 

優點:

  • 只是表現爲同一頁面。
  • 使用處置變量而不是會話變量。
  • 不要在主URL中顯示內部變量。
+0

不包括像變量聲明一樣懸掛? – frumbert

+0

請閱讀上面的鏈接中的「它做什麼」部分,它說:「這允許您將另一個文檔的內容導入到當前的文檔中,這對於重用ASP代碼和HTML的常見塊非常有用」,在這種情況下第一份文件中聲明的變量將在第二份中提供。這就像你自己導入代碼並將其寫入第一個文檔 –

+0

,但它不像server.execute,它有自己的內存空間。另外,嘗試創建一個名爲'run.asp'的文件,其內容爲:'start:<%if false'然後%><! - #include file =「yes.asp」 - ><% else %><! - #include file = 「no.asp」 - ><% end if %>:end'然後在'no.asp'中有'response.write'no'',在'yes.asp'中有''..你會發現無論if條件如何,你都會發現BOTH包含execute。所以他們被吊起來了。你必須打破這個包括;不像你有內聯工作 – frumbert