模态窗口

 

 

问题现象:
1、当向模态窗口传递参数时候,第一次打开可以得到session(。。)这个值,给session赋值另一个时候,模态窗口得到依旧是前一次的值
2、在开发过程中发现用模态窗口打开的页面会自动取缓存,使程序无法进入断点,给程序调试带来很大麻烦。

解决方案1:
在当前页面清除CACHE,
在页面代码头部加上
<%@ OutputCache Duration="1" VaryByParam="None"%>
即可禁用当前页面缓存
解决方案2:

在调用连接里添加个随机数,使模态窗口认为是不同的连接

例:

var a=window.showModalDialog("basedetail_ctl.jsp?datetime="+new Date().toString()+"&Year="+strYear+"&Month="+strMonth,"","status:no;resizable:yes;dialogHeight:410px;dialogWidth:460px;unadorne:yes");

其中: datetime="+new Date().toString()为在调用连接里添加个随机数,使模态窗口认为是不同的连接

 

window.dialogArguments[0].open的窗口和父窗口的关系

父窗口中弹出时这么写:window.showModalDialog('子窗口.aspx',window,'....');
注意第二个参数用window,这样你就把父窗口对象当做参数传递给了子窗口.
然后在子窗口中就可以通过window.dialogArguments来引用父窗口对象了.
就向楼上说的,你想怎么搞都行了...
举个例子,你可以在子窗体关闭的时候刷新父窗体,可以这么写:
window.dialogArguments.location.href=window.dialogArguments.location.href;
window.focus();
window.close();
你也可以调用主窗口里的函数:
window.dialogArguments.函数名();

做程序中要不断地弹出新增、修改的窗口,感觉每次敲代码是一种痛苦。所以,稍稍总结了一下,将模块窗口的弹出丢在了一个公共类(Function)的方法里面进行处理(其实早就该这么做)。
      eg:
      public string ModalWindow(string openAspxPage,int width,int height)
       {
               string js = string.Format("javascript:window.showModalDialog(\"{0}\",window,\"status:false;dialogWidth:{1}px;dialogHeight:{2}px\")",openAspxPage,width,height);
               return js;
       }

      本来想用StringBuilder来写的,可是StringBuilder写起来实在麻烦,干脆就换了string,反正影响不大。
       另外,又写了一个关闭页面的方法,写得粗糙一些,将就着用吧。
      public string ClosePage()
      {
            StringBuilder js = new StringBuilder();
              js.Append("<script language=\"JavaScript\">");
              js.Append("window.close();");
              js.Append("</script>");
              return js.ToString();
      }


       项目中,除了添加、修改的页面是Aspx,其它的都是ascx。
       感觉上,就是openApxPage的大小不太好控制,而且上面写的代码并不适合于DataGrid控件中的LinkButton控件,所以又得再写一个方法重载了。

      使用模态窗口时,还得注意三个问题:
      1、要弹出的页面中,一定要保证<head></head>标签间有<base target=“_self”>,否则会弹出的模态窗口上,点击按钮时,会再次弹出一个新页面。
      2、被弹出页面的按钮的事件处理中,应该有Response.Write(new Function().ClosePage());语句,用以关闭当前的模态窗口
      3、因为幽默的缓存原因,如果你在模态窗口中修改了数据,你会发现,父页面上的数据刷新了,但是当你再点击按钮,重新弹出模态窗口时,你会发现模态窗口中的内容还是上次的内容,经过我试验,手动改了html代码后,点击弹出的模态窗口还是弹出相同的页面,所以,这里要绕开这个机制,方法是在被弹出的aspx页面后加上随机参数。上面模态窗口代码可以改成如下,以避免此问题:

      public string ModalWindow(string openAspxPage,int width,int height)
       {
               string js = string.Format("javascript:window.showModalDialog(\"{0}&rand="+new Random().Next().ToString()+ "\",window,\"status:false;dialogWidth:{1}px;dialogHeight:{2}px\")",openAspxPage,width,height);
               return js;
       }
   
      注意红字部分参数,是自定义的一个参数,此参数应该是整个项目中唯一的变更名称,并且无意义(最保险的办法是把这个变更命名为lakjsdflawdfqwoifa之类的名称)。
       还有一个简单办法:加上 Response.Expires = -1 就可以了
      基本上,满足了上述条件,做页面时就操作模态窗口,相对就简单了。
       如果还想做得简单一些,可以把
ModalWindow 方法写得更完善一些,因为时间较紧,所以这里的东西比较粗糙。有空时,把它改一下,并完善一下Function类的内容,增加一些常用的JavaScript的代码,让它成为可配置的数据。
     对了,有空时应该把什么“有声有色“之类的软件里自带的JavaScript代码改动一下,重新做一个专门的JavaScript特效.net类库,到时好用。

 

说明:通过window.open打开新页面,两个页面之前便有了一种父子关系。子页通过opener可以访问父页(控件及写在父页的js函数),父页同样通过sub可以访问子页。如在父页有个js函数sayhello(),在子页中只需要opener.sayhello()便可以调用了

 

window.showModalDialog使用手册


基本介绍:
showModalDialog() (IE 4+ 支持)
showModelessDialog() (IE
5+ 支持)
window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框。
window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。

使用方法:
vReturnValue
= window.showModalDialog(sURL [, vArguments] [,sFeatures])
vReturnValue
= window.showModelessDialog(sURL [, vArguments] [,sFeatures])

参数说明:
sURL
--
必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
vArguments
--
可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
sFeatures
--
可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
1.dialogHeight :对话框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。
2.dialogWidth: 对话框宽度。
3.dialogLeft: 离屏幕左的距离。
4.dialogTop: 离屏幕上的距离。
5.center: {yes | no | 1 | 0 }:窗口是否居中,默认yes,但仍可以指定高度和宽度。
6.help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。
7.resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认no。
8.status: {yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9.scroll:{ yes | no | 1 | 0 | on | off }:指明对话框是否显示滚动条。默认为yes。
下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10.dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
11.edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12.unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

 

 

模态窗口传值:引用

http://hi.baidu.com/%D0%C7%C7%E9%C0%E1/blog/item/fc5e6e2a6f0a413e5343c10f.html

posted @ 2008-12-25 18:03  liuyan  阅读(629)  评论(1编辑  收藏  举报