updatepanel 运行时间错误

后台是没有办法直接捕获到的,不过可以通过在页面中加入以下脚本让浏览器关闭时触发一次提交
<script>
    window.onunload=function(){
  if(event.clientX>document.body.clientWidth && event.clientY < 0 || event.altKey) //如果是关闭浏览器而不是刷新页面
   __doPostBack('closing',''); //触发一次提交
}
</script>
然后即可在后台此动作进行捕获
protected void Page_Load(object sender, EventArgs e)
{
    if (Request["__EVENTTARGET"] == "closing")
    {

        ...最后的处理...
        Response.End(); //因为是最后的处理,不需要页面输出,所以执行到这里就可以了
    }

    ...原有的正常代码...
}

有些情况下,页面不会自动生成__doPostBack函数即其相关控件(如:页面上只有Button控件时),可以在页面上手工添加以下代码:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

以上方法对于用户通过任务管理器中止IE进程之类的“狠招”没有任务办法...
另外还有个缺点:
1.只有在用户关闭浏览器时才会触发,如果是页面跳转就捕获不到了
2.当然也可以把那个脚本改成
<script>
window.onunload=function()
</script>
这样,不管如果都会触发提交,但是问题更大,因为即使是用户进行正常的页面提交,比如点击页面上的某个按钮也会触发这个事件!
3.解决办法是使用UpdatePanel,这样普通的提交是不会刷新页面的,也就不会触发window.onunload事件了。但是还有一个问题,就是当第一次页面发生跳转时(不管是后台控制还是前面用户操作的)都会使页面变成一个空白页面。因为那个脚本强制让页面刷新了一下,导致跳转失效,而后台捕获到了closing参数,处理完后终止了输出,导致页面变成了空白页。
4.也有办法解决后台控制的跳转问题,前是前台用户修改地址栏这样的跳转就没有办法了,不想细写了,反正我没找到一个完美的解决办法。
PS:以上方法还有一个恶心的用途,把后台的那句"Response.End();"去掉后,就可以让用户永远离开你的页面(包括修改地址栏和点击收藏夹等),除非关闭浏览器

另外再提供一个解决的思路,可以较好的实现页面关闭或页面跳转后的处理,但是实现起来相对麻烦些。就是用ajax做“心跳”:当用户打开你的页面时,保存一个对应的时间戳以及页面关闭后要做的处理中用到的相关信息。在页面中加入一个时间触发器,每过一段时间(比如8秒)就用ajax提交一次,刷新用户对应的时间戳。(也可以在global的sessionstart中进行时间戳的创建,并用sessionid作为标识进行刷新,这样可以不局限于一个页面,做到仅当用户关闭所有打开你的站点的窗口之后才触发,灵活性非常高)另外用一个线程,每过一段时间去检查这个保存的时间戳(比如20秒),如果发现每个时间戳和系统当前时间相差大于等于阀值(比如20秒)即认定用户关闭了浏览器或跳转到别的页面了,然后就可以进行你要的处理了。

你可能感兴趣的:(Ajax,浏览器,function,脚本,任务,button)