最近做项目遇到一个奇怪的问题:如果浏览器session丢失后,点击一个按钮,触发一个Ajax方法,浏览器会弹出一个对话框。异常信息如下:
后来经过查找,原来我的页面继承了一个BasePage.cs文件,BasePage.cs文件里判断session是否存在,如果不存在直接跳转到登录页(这里使用的跳转是Response.Redirect())。正是因为有这跳转代码的存在所有才导致了报错。Ajax方法是无法执行页面跳转的操作的。这里如果需要让Ajax方法执行跳转页面的操作,需要在web.Config文件里配置一下。添加以下代码即可:
<system.web>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
</system.web>
有的时候可能你会说,我的配置文件里面已经加上了这个配置信息,为什么页面还是会报错呢?
这种方式只支持你在cs文件里面执行Response.Redirect()的跳转,不支持Server.Transfer()和Server.Execute()的转发,以及Response.Write("<script></script>")在页面输出脚本跳转。
但是你可以使用Response.Redirect()跳转到指定页,在那个指定页里面写js脚本。
当然了,如果你偏不要在配置文件里加上这段代码,你也可以象网上说的那样在页面文件加上如下Js脚本对异常信息进行友好的处理。
<script language="javascript" type="text/javascript">
//当使用ajax的页面,session丢失时,弹出提示并转向
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); function EndRequestHandler(sender, args)
{
if (args.get_error() != undefined){
if(args.get_error().message.substring(0, 51) == "Sys.WebForms.PageRequestManagerParserErrorException")
window.location.reload(); //出现Session丢失时的错误处理,可以自己定义。
else
alert( "登录超时,请重试! "); //其他错误的处理。
args.set_errorHandled(true);
}
}
</script>