赞
踩
一、在主窗体中:
1、
function BySearch(layerid)
{
if(window.showModalDialog("../BySearch.aspx?id="+layerid,window,"status=no;dialogWidth=800px;dialogHeight=600px;menu=no;resizeable=yes;scroll=yes;center=yes;edge=raise")=="OK") {
// window.location.reload();
window.document.forms(0).submit();
//注意此处若使用document.location.reload(); 会导致“要再次显示该网页,internet exploer 需要重新发送您以前提交的信息”的问题,因此用window.document.forms(0).submit(); 更好。
}
}
同时在老网页的GridView中需要添加Page_PreRender事件,在Page_PreRender中将GridView中的数据重新绑定一次即可,否则window.document.forms(0).submit(); 不起作用。
protected void Page_PreRender(object sender, EventArgs e)
{
bindData();
}
2、BntSearch.Attributes.Add("onclick", "BySearch(" & layerid & ")")
二、在子窗体中:
服务器端按钮:
Response.Write("<script language=javascript>window.returnValue='OK';self.close();</script>")
三、在子窗体中清空ShowModalDialog数据缓存
Response.Expires = -1
四、以下为弹出窗体参考:
有时修改了某些数据,然后通过ShowModalDialog来显示,这时通常显示出来的数据还是上一次的数据
可能ShowModalDialog缓存机制的问题,这时你就需要手动的去清除缓存或者写一些代码……
HTML方面
<meta http-equiv="pragram" content="no-cache">
禁止浏览器从本地缓存中调阅页面。
网页不保存在缓存中,每次访问都刷新页面。
<meta http-equiv="cache-control" content="no-cache, must-revalidate">
同上面意思差不多,必须重新加载页面
<meta http-equiv="expires" content="0">
网页在缓存中的过期时间为0,一旦网页过期,必须从服务器上重新订阅。
.NET方面
Response.Expires = -1;
<script language="javascript" type="text/javascript">
function ScanMessageDetail(messageId)
{
if(window.showModalDialog("testclose.aspx?messageid="+messageId,"","status=no;dialogWidth=800px;dialogHeight=500px;menu=no;resizeable=yes;scroll=yes;center=yes;edge=raise")=="OK") {
window.document.forms(0).submit();
document.location.href = "DataListTest.aspx";
}
}
</script>
在后台中注册脚本
protected void GridView1_RowDataBound(object sender,GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes.Add("onclick", "ScanMessageDetail(4939)");
}
}
在目标页的关闭按钮
客户端按钮:
<input id="Button1" type="button" value="关闭" οnclick="javascript:window.returnValue='OK';self.close();"/>
服务器端按钮:
1、在子窗口<head>里加一句 <base target=_self>
2、Protected Sub BntClose_Click(ByVal sender As Object, ByVal e As System.EventArgs)
按钮事件
Response.Write("<script language=javascript>window.returnValue='OK';self.close();</script>")
End Sub
3、若子窗口中用的是UpdatePanel,则用Response.Write会出错,此时应用<Triggers>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="BntClose" />
</Triggers>
</asp:UpdatePanel>
在字窗口里面设置
<body onbeforeclose="parent.location.value='你想要的地址'">
window.opener.location="xxxx.asp"试试
showModalDialog()子窗口刷新父窗口 收藏
今天再次使用showModalDialog(),发现了两个问题,一是子窗口如何刷新父窗口,二是窗口的参数问题。
1 子窗口刷新父窗口
如果是window.open();问题就好办,直接用window.opener.location.reload();就搞定了
但是如果是window.showModalDialog(),它里面是没有window.opener的,不能用opener引用父窗口,直接调用用报错。
总结了一下有两种方法可以解决,一是在子窗口中刷新父窗口,二是在子窗口关闭后,父窗口自己刷新。
(1)在子窗口中刷新父窗口
父窗口: 因为子窗口不能直接引用父窗口,所以需要父窗口主动传递指针变量,就是window.showModalDialog的第二个参数,参数为“window”,
示例:
var returnValue = window.showModalDialog(url,window,"dialogHeight=350px;dialogWidth=400px;center=yes;status=no;scroll=no;resizable=yes");
注意:window不要加引号。
子窗口:执行完操作后调用window.dialogArgument.location.reload();
网上说只调用这一句就可以了,但我试了不行,具体原因没查到,自己猜测要这么用,父窗口必须是iframe. 如果父窗口不是iframe,想要实现这个功能,还可以在body中加入"onUnload=window.dialogArgument.location.reload()" ,这样子窗口关闭时就可以刷新父窗口了。
(2)在父窗口中刷新自己
这个实现比较简单,在子窗口关闭后,父窗口自己刷新,例如:
var returnValue = window.showModalDialog(url,window,"dialogHeight=350px;dialogWidth=400px;center=yes;status=no;scroll=no;resizable=yes");
if(returnValue == "true"){
window.location.reload();
}
还有一种方法就是在子窗口中调用父窗口的一个方法,该方法自己刷新本页面(父窗口);
子窗口:window.dialogArgument.reloadPage();window.close;
父窗口: function reloadPage(){window.location.reload();}
但是我试验后不行,能调用到这个方法,但是就是不刷新,原因不详。
2 showModalDialog参数问题:
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]);
第三个参数用来描述对话框的外观等信息,我调整了半天都不见效,后来发现原因出现在两个地方:
(1)长度,宽度,都是用 dialogHeight, dialogWidth表示,而不是heigh,width,和window.open()是不同的。
(2)多个参数用";"分割,而不是用","。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。