在Global.asax中设置会话变量会导致AJAX错误

时间:2010-03-26 17:07:52

标签: asp.net javascript global-asax

我的asp.net应用程序出现了一个非常奇怪的问题,我花了一个时间来追踪,但我仍然不知道是什么原因引起了这种行为。

如果我在Application_PreRequestHandlerExecute事件中设置会话变量,那么我的外部JavaScript文件将被忽略,从而导致大量错误。我已经简化了下面的问题。

E.g。

我有一个名为JScript.js的文件,其中包含代码:

function myAlert() {
 alert("Hi World");
}

在我的Default.aspx文件中,我用代码引用了js:

<script src="JScript.js" type="text/javascript"></script>

在正文onload事件中,我调用了myAlert()函数:

<body onload="myAlert()">

最后在Global.asax文件中:

Private Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs)
   HttpContext.Current.Session("myVar") = "MyValue"
End Sub

如果运行Default.aspx文件,您将看到未调用js函数,但是,如果您注释掉代码行Global.asax,则会调用外部js并在页面执行该函数负荷。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

PreRequestHandlerExecute事件运行两次。一次用于ASPX文件,一次用于JS文件。当ASPX页面请求JS文件时,PreRequestHandlerExecute事件运行时会发生此问题。对于导致异常的JS文件,Session为NULL(或Nothing)。由于JS文件发生异常,因此该文件(myAlert函数)的内容永远不会加载到ASPX页面中。因此,ASPX页面无法调用myAlert函数,因为从未加载过JS文件。