Jack-Leung

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 在实际运用中,我们在a.aspx页面需要打开一个新窗口(为描述方便,假定为b.aspx),在新窗口关闭之前,需要禁用a.aspx页面。b.aspx里面触发有相应的事件,当事件触发的时候,同时应该更新b.aspx.

解决方法:

     这时我们最好的选择是用模式窗口打开b.aspx,即showModalDialog(b.aspx).

     如果直接用模式窗口打开b.aspx页面,如果b.aspx仅仅是textbox、dropdownlist之类的运行在服务器端的文本控件(这些控件本身也不能触发对应的事件),返回这些控件的值不会出什么问题,但是如果要有服务器端button之类调用cs里面的方法,或者本身会触发事件,就会出问题。当触发这些方法,就会将模式窗口打开的页面做为一个页面弹出(本例也就是b.aspx)。模式窗口里面是不能刷新的,所以这些事件如果要更新当前模式窗口里面的页面内容,是不可能的。

     这中机制是没办法改变的,触发了相应的事件,就会重新加载一次页面(触发了Page_Load事件),即使IsPostBack是false.

     这种情况下该怎么做才能达到预定的目的?

     我们不妨试试这种方法:用框架进行操作。说简单点:创建一个新页面(c.aspx),只做框架支撑。对应子帧指向指定的页面(b.aspx)。这样我们在a.aspx页面里用模式窗口打开c.aspx,就达到预定的效果了。b.aspx页面可以有任何触发事件进行更新页面的内容。同时如果要传值,就需要先传值到框架页面,然后再传到既定的页面。这种方法的由来是参考了同事的做法,本人觉得这种方法很简便,不需要有太多的考虑。操作起来相对来说最容易。

     第二种方法我们就需要有ajax方面的知识了。这种做法需要注意的是同样不能够触发到本页面的事件,否则就会自动弹出模式窗口里面的页面(没有页面支撑的情况下)。这种方式下我们需要借助第三个aspx页面来进行相应的事件操作处理,然后返回操作结果以更新(更新而不是刷新)模式窗口里面的内容。这种方式的难度要比第一种方法大,不好操作。尤其是模式窗口里面控件涉及到数据绑定的时候,更不好操作。

    第三种方法本人没操作成功。大致思想:用window.open()方法打开b.aspx页面,b.aspx页面加载的时候,将a.aspx里面所有的控件都禁用掉,同时也要将a.aspx页面的刷新功能关闭掉

(shift+F10,F5,右键,浏览器本身的刷新按钮),当b.aspx页面关闭的时候,传入一个参数到a.aspx页面,直到该参数值为真的时候,再释放所有禁用的资源。在实际操作中,open()方法打开b.aspx页面后禁止刷新a.aspx页面遇到了问题。在b.aspx页面的window.onload=funciton(){}添加
opener.document.oncontextmenu="return false",达不到禁用右键

opener.document.onkeydown=function(){if(event.keyCode==116) event.keyCode=0;event.returnValue=false;}调用对应的事件也禁止不了F5键。

posted on 2012-03-07 19:03  Jack.leung  阅读(886)  评论(0编辑  收藏  举报