asp.net关于模式窗口刷新问题

来源:百度文库 编辑:神马文学网 时间:2024/06/13 07:46:26
asp.net关于模式窗口刷新问题
新一篇: asp.net中采用ajax进行多文件上传和删除
问题描述:
在实际运用中,我们在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键。
当初也怀疑是这些事件写的有问题,就直接把这些事件放在一个单独的一个页面做测试,一旦到测试页面的时候,这些都是正确的:禁掉了F5和右键。回到用open()打开b.aspx页面,达不到禁用目的。后面的根本就进行不下去了,很丧气............
第一种第二种方法都不错,第二种方法要对ajax有一定的了解。至于选择哪种技术,则需要看个人的情况,哪种方法上手快就选那种方法。
第三种方法出现的问题,不知该如何解决....
发表于 @2007年08月02日 08:58:00|评论(2)|编辑
旧一篇: 未将对象引用设置到对象的实例--问题记录