首先,我們從簡單的例子開始,這個例子示範了如何在頁面中點擊按鈕開啟新頁面,輸入資料,然後返回到初始頁面並進行更新。
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')
這下開啟到很正常,只是參數傳不進去了也傳不出來了。