使用模态窗口编辑数据
为提高客户的体验,经常使用模态窗口。以下为使用的一个例子。
1、建立一个含有iframe的html文件,用于防止自刷新的问题。
Fram.htm
2、 在要打开模态窗口的起始处,编写如下函数:
函数的作用是生成打开模态窗口的JS代码,可以指定窗口的宽度和高度,接收模态窗口关闭后传回的数据。
另处,在发生点击事件的控件处要注册些脚本。如下:
注意这里传递了一个StructureUID参数,用于在模态窗口中接收这个参数,然后根据参数提取数。
3、在模态窗口中进行数据处理。
在模态窗口的后台代码中添加如下函数:
函数可以指定是否刷新父窗口,在编辑完数据和取消编辑处进行调用。
1、建立一个含有iframe的html文件,用于防止自刷新的问题。
Fram.htm
<html>
<head>
<title>在模态窗口中打开的框架页</title>
</head>
<body topmargin="0" leftmargin="0" scroll="no">
<iframe width="100%" height="100%" border="0" id="frame1"></iframe>
<script Language="Javascript">
var el=document.frames.frame1;
if(el!=null){
var arg=window.dialogArguments;
if(arg!=null)
frame1.location.href=arg;
}
</script>
</body>
</html>
<head>
<title>在模态窗口中打开的框架页</title>
</head>
<body topmargin="0" leftmargin="0" scroll="no">
<iframe width="100%" height="100%" border="0" id="frame1"></iframe>
<script Language="Javascript">
var el=document.frames.frame1;
if(el!=null){
var arg=window.dialogArguments;
if(arg!=null)
frame1.location.href=arg;
}
</script>
</body>
</html>
2、 在要打开模态窗口的起始处,编写如下函数:
private string GetOpenModalDialogScript(int width, int height)
{
StringBuilder sb = new StringBuilder();
sb.Append("<script language='javascript'>");
sb.Append("function EditStructure(arg)");
sb.Append("{");
sb.Append("var argument;");
sb.Append("argument = 'EditStructureData.aspx' + '?StructureUID=' + arg;");
sb.AppendFormat("var dialog = 'dialogWidth={0}px;' + 'dialogHeight={1}px;' + 'center=yes;status=no';", width, height);
sb.Append("var retValue=window.showModalDialog('Frame.htm',argument,dialog);");
sb.Append("if(retValue==1)");
sb.Append("top.location.href=top.location.href;");
sb.Append("}");
sb.Append("</script>");
}
{
StringBuilder sb = new StringBuilder();
sb.Append("<script language='javascript'>");
sb.Append("function EditStructure(arg)");
sb.Append("{");
sb.Append("var argument;");
sb.Append("argument = 'EditStructureData.aspx' + '?StructureUID=' + arg;");
sb.AppendFormat("var dialog = 'dialogWidth={0}px;' + 'dialogHeight={1}px;' + 'center=yes;status=no';", width, height);
sb.Append("var retValue=window.showModalDialog('Frame.htm',argument,dialog);");
sb.Append("if(retValue==1)");
sb.Append("top.location.href=top.location.href;");
sb.Append("}");
sb.Append("</script>");
}
另处,在发生点击事件的控件处要注册些脚本。如下:
LinkButton lbnName = e.Item.FindControl("lbnName") as LinkButton;
lbnName.Text = dataItem.Name;
if(!Page.IsClientScriptBlockRegistered("EditStructureData"))
{
Page.RegisterClientScriptBlock("EditStructureData", this.GetOpenModalDialogScript(300,300));
lbnName.Attributes.Add("onclick",
string.Format("EditStructure('{0}');return false;", dataItem.StructureUID.ToString()));
lbnName.Text = dataItem.Name;
if(!Page.IsClientScriptBlockRegistered("EditStructureData"))
{
Page.RegisterClientScriptBlock("EditStructureData", this.GetOpenModalDialogScript(300,300));
lbnName.Attributes.Add("onclick",
string.Format("EditStructure('{0}');return false;", dataItem.StructureUID.ToString()));
3、在模态窗口中进行数据处理。
在模态窗口的后台代码中添加如下函数:
private void EndModalDialog()
{
this.EndModalDialog(true);
}
private void EndModalDialog(bool refurbish)
{
//返回值为1表示成功,top.close()表示把Frame.htm关闭
string script = string.Format("<script language=\'Javascript\'>window.returnValue={0};top.close();</script>", refurbish ? 1 : 0);
Page.Response.Write(script);
Page.Response.End();
}
{
this.EndModalDialog(true);
}
private void EndModalDialog(bool refurbish)
{
//返回值为1表示成功,top.close()表示把Frame.htm关闭
string script = string.Format("<script language=\'Javascript\'>window.returnValue={0};top.close();</script>", refurbish ? 1 : 0);
Page.Response.Write(script);
Page.Response.End();
}
函数可以指定是否刷新父窗口,在编辑完数据和取消编辑处进行调用。
posted on 2005-09-08 10:05 网际飞狐 阅读(2486) 评论(7) 编辑 收藏 所属分类: ASP.NET
http://u.huoban001.com/space.php
评论
#1楼 2005-09-09 10:56 Boler Guo
可以不用加iframe的~ 回复 引用 查看
#2楼 2005-09-10 22:17 wuku52 [未注册用户]
不用加iframe的?
请问怎么做啊,我也是加iframe的 回复 引用 查看
#3楼 2005-09-26 16:47 Boler Guo
我不知道“防止自刷新的问题”我理解的對不對,是不是每當submit就會彈出一個新頁面的問題?如果是這樣可以解決的。
最近几天一直在处理模式窗口的问题,索性写了这篇总结,以供参考:
http://blog.csdn.net/tom0421/archive/2004/11/30/199005.aspx
1。打开窗口:
var handle = window.showModalDialog(url, objects, feathers);
其中:objects可以为参数(包括数组),也可以是对象。
通常的用法 objects = {window} ,把父窗体的对象共享给子窗体。
2。关闭子窗口:
window.close();
3。从子窗体传参数给父窗体:
window.returnVal = string;
3。清除缓存,防止模式窗口页面不更新的情况:
HTML
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Mon, 23 Jan 1978 20:52:30 GMT">
4。防止打开新窗口(如提交表单):
<base target="_self">
between <head> and </head>
5。在模式窗口使用F5刷新页面:
<base target="_self">
<body onkeydown="if (event.keyCode==116){reload.click()}">
<a id="reload" href="filename.htm" style="display:none">reload...</a>
其中:filename为窗口页面。
6。防止模式窗口打开的页面出现cookie丢失的情况:
模式窗口打开新窗口时,仅可以使用 showModalDialog(url,window,feathers); 方法,且 objects 为 window 。
7。在弹出窗口中获得或设置主窗口的任何值:
打开弹出窗口时用:showModalDialog(url, window, feathers)
在弹出窗口中使用 window.dialogArguments 对象(即主窗口传递过来的 window 对象集),即可以获得或者设置主窗口的值。