ASP 3.0 - Server.Execute问题:患有“ASP失忆症”(文本修订版)

时间:2011-02-14 22:02:15

标签: asp-classic

我正在使用IIS 6,并创建了两个ASP 3.0文件: -Main.asp -Colors.asp

Main.asp

<%
If sColor = true then
Server.Execute "Colors.asp"
End If
'If sColor is true, Pops over to Colors.asp
'Then pops right back over to here again

'Once back here again, it has no idea what
'sRed or sBlue was at all...it's as if has
'been "blank slated"...sRed? Who the heck is sRed?

If sRed then
Response.Write "Color is Red"
End If
'Does not work...skips right over...
'Who is sRed? What is sRed?
'Oh well, keep on truckin'
%>

Colors.asp

<%
Dim sRed
sRed = instr(sString, "Red") >0

Dim sBlue
sBlue = instr(sString, "Blue") >0

Dim sGreen
sGreen = instr(sString, "Green") >0
%>

如果要进入Colors.asp文件 上面并修改/附加它如下:

<%
Dim sRed
sRed = instr(sString, "Red") >0

Dim sBlue
sBlue = instr(sString, "Blue") >0

Dim sGreen
sGreen = instr(sString, "Green") >0

If sRed then
Response.Write "Color is Red"
End If
%>

当sColor在Main.asp和sString上为真时,会收到一个“Color is Red”的屏幕 包含“红色”。所以我知道她已经到了那里,并且还回到了Main.asp ......但不知怎的,她对这些变量一无所知:sRed,sBlue或者在Colors.asp上变暗的sGreen。一旦她回到Main.asp,她就会毫无头绪。

是什么给出的?一旦她在Colors.asp结束后回到Main.asp,为什么她有ASP Amnesia?

修改

亲爱的YougoTiger,

我在Main.asp中做了你的建议(我认为):

If sColor = true then
   Server.Execute "Colors.asp"

   If sRed then
      Response.Write "Color is Red"
   End If
End If

没有...仍然有ASP失忆症谁?

修改2

亲爱的Bitwize,

我正在使用Server.Execute而不是#include来释放服务器。如您所知,#includes总是首先在ASP中处理,无论它们是否在If块内。我基本上试图通过Server.Execute进行动态服务器端包含,根据Microsoft,它实际上可以放在If块中:

Microsoft Support - Using the Server.Execute Method

The New ASP 3.0 Server Methods(注意:这最初是http://www.15seconds.com/issue/010220.htm,但该网站已消失,此链接现已重定向到数字域。请随意自行搜索Paul Litwin撰写的文章如果能找到,请更新此链接。)

A Look at ASP 3.0

The low-down on #includes

我仍然需要帮助,或者更好地解释我的具体情况。我在Color.asp文件中有很多变暗的变量,如果sColor = False,我不希望服务器烦恼。

3 个答案:

答案 0 :(得分:1)

如果没有一些改变,不要认为可以做到。使用server.execute,2页完全没有意识到彼此的局部变量(参见下面的证明)。尽管你没有放松条件能力,但是包含会更好。

请求/响应对象由两个文件共享,因此您可以根据需要使用它们。至于在文件之间发送变量,您唯一的选择是会话或应用程序变量。请参阅下面的代码示例。

文件1:

dim localParent
localParent="start Value"
Response.write("Parent:"&localParent&"<br>")
Server.Execute "file.asp"

Response.write("Parent after Exec:"&localParent&"<br>")

文件2:

Response.write("Child:"&localParent&"<br>")
localParent = "Child changed"
Response.write("Child Afer set:"&localParent&"<br>")

输出:

Parent:start Value
Child:
Child Afer set:Child changed
Parent after Exec:start Value

会话变量传递: 文件1:

Dim myVar
'Do stuff
session("myVar") = myVar ' Save variable in session
Server.Execute "file.asp"
myVar = session("myVar") 'get changed variable back out of session

文件2:

Dim myLocalVar
myLocalVar = session("myVar")   ' Get variable from session
'Do stuff to myLocalVar
session("myVar") = myLocalVar 'Put variable back into session for calling page to use.

答案 1 :(得分:0)

我想知道这可能是范围问题吗?我看到你在范围问题上遇到两个可能的地方:

首先,既然你的sRed在另一个文件中,当你运行server.execute时,范围是否限于该文件?

其次,既然你在if if中调用server.execute,我希望你的另一个文件的范围在if和endif之间。然后你在endif之后检查sRed。在这两个中,我认为第二个更有可能。试试你的

If sRed then
 Response.Write "Color is Red" 
End If 
在server.execute之后

阻止内部你的第一个if if block,看看是否是这种情况。

答案 2 :(得分:0)

Bitwize完全正确 - 调用页面无法访问已执行页面的局部变量,执行页面也无法访问调用页面局部变量。如果需要共享局部变量,则需要使用include指令。

我使用Server.Execute()技术构建了完整的ASP站点体系结构,并且每个执行的脚本都是独立执行的。您可以执行的唯一变量共享是ApplicationSession个对象,这两个对象都存在问题。

您可能实现所需效果的唯一另一种方法是通过代码中的HTTP请求到其他脚本,并让这些脚本返回带有相关信息的JSON / XML结构,但是恕我直言这会比使用include指令增加更多的开销