2011-11-30 168 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