首先,我们从简单的例子开始,这个例子演示了如何在页面中点击按钮打开新页面,输入数据,然后返回到初始页面并进行更新。
1. 用VS.NET新建一个项目,选择“Asp.net Web应用程序”
2. 在WebForm1.aspx窗口上增加一个TextBox和一个Button
3. 在WebForm1.aspx的代码中Page_Load中,增加
If (Not IsClientScriptBlockRegistered("clientScript")) Then
Dim strScript As String = "<script>" + vbCrLf
strScript += "function OpenWin(){" + vbCrLf
strScript += "var str=window.showModalDialog('WebForm2.aspx',document.Form1.TextBox1.value)" + vbCrLf
strScript += "if(str!=null) document.Form1.TextBox1.value=str" + vbCrLf
strScript += "}" + vbCrLf
strScript += "</script>" + vbCrLf
RegisterClientScriptBlock("clientScript", strScript)
End If
Button1.Attributes.Add("onclick", "OpenWin()")
4. 增加一个WebForm2
5. 切换到HTML,删除<body></body>段间内容,代替为
<frameset rows="0,*">
<frame src="about:blank">
<frame src="WebForm3.aspx">
</frameset>
6. 新建一个WebForm3
7. 切换到HTML,在<body>里增加一个“ID=’MyBody’”
8. 在WebForm3上加上一个TextBox和一个Button
9. 在代码里增加一个变量
Protected MyBody As System.Web.UI.HtmlControls.HtmlControl
10. 在Page_load中增加
If IsPostBack Then
Dim strScript As String = "<script>" + vbCrLf
strScript += "window.parent.returnValue='" + TextBox1.Text.Replace("'", "\'") + "'" + vbCrLf
strScript += "window.parent.close()" + vbCrLf
strScript += "</script>" + vbCrLf
If (Not IsClientScriptBlockRegistered("clientScript")) Then
RegisterClientScriptBlock("clientScript", strScript)
End If
End If
If Not IsPostBack Then
MyBody.Attributes.Add("onload", "document.Form1.TextBox1.value=window.parent.dialogArguments")
End If
好了,现在运行试试,出错了,怎么会这样呢?
现在我们在WebForm3的HTML页面中,找到<body>区,增加一个runat="server"
再运行一下,一切OK了吧。
现在我们来看一下上面的代码,
首先,在WebForm1初始时,我们定义了一个叫“clientScript”的JavaScript脚本块,并且在这个页中注册了这个脚本块。
这个脚本块定义了一个函数OpenWin
function OpenWin()
{
var str=window.showModalDialog('WebForm2.aspx',document.Form1.TextBox1.value)
if (str!=null)
document.Form1.TextBox1.value=str
}
并且将这个函数与按纽Button1的OnClick事件关联起来。
这个函数用window的ShowModalDialog事件打开一个模态的对话框网页WebForm2.aspx,参数是TextBox中的值
其次,在WebForm2中,我们不写代码,只是让WebForm2作为一个容器,定义为框架,其中WebForm3是框架里的一个网页。
最后,我们转到WebForm3中,Page_Load中的指定的JavaScript代码,是让WebForm2的返回值为WebForm3中TextBox值,然后关闭WebForm2。
很明显,WebForm2只是一个过渡页面,为什么要多此一举呢?
我们试着将WebForm1的JavaScript脚本修改一下,直接打开WebForm3.aspx,然后在WebForm3的Page_Load中,将Window.Parent修改为Window,然后再运行一遍,看看会发生什么。
打开网页对话框,一切正常,但是在对话框中,按键却不能返回,既没有返回值,也不能关闭自己,只是有窗口一闪而过。
这是怎么回事呢?
其实,是因为我们用window.showModalDialog打开模态对话框的原因。对于一个用ShowModalDialog方式打开的模态对话框,没有办法用Window.close()的方式来关闭的。按按纽后,打开了一个新的页面,然后又关闭了这个页面。
所以我们用WebForm2中frame来防止提交时打开新页面。
那么,我们不用ShowModalDialog,而用Open会怎么样呢?
在WebForm1中,继续修改脚本
window.open('WebForm3.aspx', 'newwindow', 'height=100, width=400, toolbar =no, menubar=no, scrollbars=no, resizable=no, location=no, status=no')
这下打开到很正常,只是参数传不进去了也传不出来了。