2010-03-26 86 views
1

我的asp.net应用程序出现了一个非常奇怪的问题,它花了我一个时间来追踪,但我仍然不知道是什么导致了这种行为。在Global.asax中设置会话变量会导致AJAX错误

如果我在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函数心不是所谓的,但是,如果你注释掉外部JS叫的那么代码Global.asax线与功能当页面加载时执行。

这是为什么?

+0

您是否为此应用程序启用了通配符映射? http://weblogs.asp.net/scottgu/archive/2007/03/04/tip-trick-integrating-asp-net-security-with-classic-asp-and-non-asp-net-urls。 aspx – 2010-03-26 17:14:29

回答

2

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

+0

这很有道理。非常感谢。 – SausageFingers 2010-03-26 17:43:27

+0

有没有办法测试哪个文件导致PreRequestHandlerExecute触发?或者在使用它之前测试会话是否没有什么更好。 – SausageFingers 2010-03-26 17:47:23