凯锐
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
::
101 随笔 :: 39 文章 :: 377 评论 :: 25 引用
利用.NET代碼實現點擊按鈕彈出新窗體,輸入數據后返回並刷新頁面
利用.NET代碼實現點擊按鈕彈出新窗體,輸入數據后返回並刷新頁面,網上大部份都是JavaScript實現,為使用方便,本人將其封裝進一段.NET代碼中。只所以稱作.net代碼,是因為C#/VB各一份嘍:)
也是因為自己的項目中要用到一項類似於Winform的Messagebox.ShowDialog這樣的功能,起初以為跟Winform差不了多少的,誰知做的時候卻出現了很多"難以預料"的問題,本著解決問題的程序員的態度,花了一個下午的時間,將遇到的問題基本上全解決了。記錄一下,或許會有朋友也存在類似問題,為免少走一些元枉路,索引再花點時間整理了一下。
以下講解部分使用VB講解,喜歡C#的可以在隨后的附件中下載C#版本。
首先新建一個Default.aspx文件,在aspx Source中輸入:
Default.aspx
<%
@ Page Language
=
"
VB
"
AutoEventWireup
=
"
false
"
CodeFile
=
"
Default.aspx.vb
"
Inherits
=
"
_Default
"
%>
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
Untitled Page
</
title
>
</
head
>
<
body
>
<
form
id
="form1"
runat
="server"
>
<
div
>
<
asp:Label
ID
="lblMessage"
runat
="server"
Font-Bold
="True"
>
Open a New Page Form , and transport a Variant to the new page
</
asp:Label
><
br
>
<
br
>
<
asp:TextBox
ID
="tbxMsg"
runat
="server"
Width
="431px"
>
Here are the Variant 's value
</
asp:TextBox
><
br
>
<
br
>
<
asp:Button
ID
="btnOK"
runat
="server"
Text
="OK"
Width
="96px"
></
asp:Button
>
</
div
>
</
form
>
</
body
>
</
html
>
然后轉至
CodeFile輸入代碼:
Default.aspx.vb
Partial
Class _Default
Class
_Default
Inherits
System.Web.UI.Page
Protected
Sub Page_Load()
Sub
Page_Load(
ByVal
sender
As
Object
,
ByVal
e
As
System.EventArgs)
Handles
Me
.Load
If
(
Not
ClientScript.IsClientScriptBlockRegistered(
"
clientScript
"
))
Then
Dim
strScript
As
String
=
"
<script>
"
+
vbCrLf
strScript
+=
"
function OpenWin(){
"
+
vbCrLf
strScript
+=
"
var str=window.showModalDialog('Default2.aspx',document.getElementById('tbxMsg').value)
"
+
vbCrLf
strScript
+=
"
if(str!=null) document.getElementById('tbxMsg').value=str
"
+
vbCrLf
strScript
+=
"
}
"
+
vbCrLf
strScript
+=
"
</script>
"
+
vbCrLf
ClientScript.RegisterClientScriptBlock(Page.GetType(),
"
clientScript
"
, strScript)
End
If
btnOK.Attributes.Add(
"
onclick
"
,
"
OpenWin()
"
)
End Sub
End Class
很明顯,我上面只是簡單的string拼接。記得曾經在某網站看到說用StringBuilder的優於直接String的拼接吧。原理上是的,如果你愿意,就自行改用StringBuilder吧
接下來再加一個aspx文件,直接在aspx Source中輸入如下:
Default2.aspx
<%
@ Page Language
=
"
VB
"
AutoEventWireup
=
"
false
"
CodeFile
=
"
Default2.aspx.vb
"
Inherits
=
"
Default2
"
%>
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
Untitled Page
</
title
>
</
head
>
<
frameset
rows
="0,*"
>
<
frame
src
="about:blank"
>
<
frame
src
="Default3.aspx"
>
</
frameset
>
</
html
>
這個比較簡單,CodeFile就沒有什么啦。
加入第三個aspx, aspx Source如下:
Default3.aspx
<%
@ Page Language
=
"
VB
"
AutoEventWireup
=
"
false
"
CodeFile
=
"
Default3.aspx.vb
"
Inherits
=
"
Default3
"
%>
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
Untitled Page
</
title
>
</
head
>
<
body
id
="MyBody"
runat
="server"
>
<
form
id
="form1"
runat
="server"
>
<
div
>
<
asp:Label
ID
="lblMessage"
runat
="server"
Width
="435px"
>
Please enter some words:
</
asp:Label
><
br
>
<
br
>
<
asp:TextBox
ID
="tbxMsg"
runat
="server"
Width
="431px"
></
asp:TextBox
><
br
>
<
br
>
<
asp:Button
ID
="btnOK"
runat
="server"
Text
=" OK "
Width
="96px"
></
asp:Button
>
</
div
>
</
form
>
</
body
>
</
html
>
註意一下
<body id="MyBody" runat="server">這句話,vs2005默認產生的Document的body是沒有id,runat的,這里請手工加上去。
CodeFile如下:
Default3.aspx.vb
Partial
Class Default3
Class
Default3
Inherits
System.Web.UI.Page
Protected
Sub Page_Load()
Sub
Page_Load(
ByVal
sender
As
Object
,
ByVal
e
As
System.EventArgs)
Handles
Me
.Load
If
IsPostBack
Then
Dim
strScript
As
String
=
"
<script>
"
+
vbCrLf
strScript
+=
"
window.parent.returnValue='
"
+
tbxMsg.Text.Replace(
"
'
"
,
"
\'
"
)
+
"
'
"
+
vbCrLf
strScript
+=
"
window.parent.close()
"
+
vbCrLf
strScript
+=
"
</script>
"
+
vbCrLf
If
(
Not
ClientScript.IsClientScriptBlockRegistered(
"
clientScript
"
))
Then
ClientScript.RegisterClientScriptBlock(Page.GetType(),
"
clientScript
"
, strScript)
End
If
End
If
If
Not
IsPostBack
Then
MyBody.Attributes.Add(
"
onload
"
,
"
document.getElementById('tbxMsg').value=window.parent.dialogArguments
"
)
End
If
End Sub
End Class
基本上就是這樣子的,做完之后感覺很簡單,呵呵。當然,這個也沒有花很多時間,因為網上的現成代碼很多的。見隨后的參考文獻2
所花時間多的是隨后,將其放入真實項目中的時候,真實項目中,由於使用到了2.0的新加功能MasterPage,這下好了,將上面代碼原封不動的拷進去,總沒有效果出來,最后不得以設定了一下調試,說什么獲取不到對像,原話是什么,我也不記得,大概意思就是這樣子了,現在已經沒有了錯誤,我總不會為了重現這個錯誤,再試一下吧。呵呵:)如果你有興趣見識的話,將下載的原碼中
document.getElementById('" + tbxMsg.ClientID + "').value這句話改成
document.getElementById(' tbxMsg').value就可看到效果了。
其實,我能夠想到加ClientId也是帶點僥幸的意味的。
因為有VS2005強勁的JavaScript調試功能才得以得逞:)。調試時我發現在頁面生成之後,原來的頁面中的tbxMsg
x id
被改成類似這樣一個東西
ctl00$ContentPlaceHolder1$tbxMsg1於是就用這個代替了原先的tbxMsg,當時程序沒有報錯,也就是通過了,效果也出來了。呵呵,於是我記起WebUI Control好像都有一個什么ClientID的屬性。應該就類似於上面ctl00$ContentPlaceHolder1$tbxMsg1的東西吧。於是就用tbxMsg.ClientID試了一下。居然正確,有點歪打正著的感覺!竊喜ing.......:)
下載文件當中的MasterPage參考了CodeProject上的一篇文章,見參考文獻1.
說這些說了這麼多,也不知道你有沒有耐心看下去,還是附上解決方案吧,看Demo可能有些人覺得更實在。
模式窗體傳值源碼下載
參考文獻:
1、
Creating a Common Toolbar in ASP.NET 2.0 using MasterPage, Delegate and Events.
2、
CSDN明飛的專欄
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2007-10-09 21:49
凯锐
阅读(1753)
评论(6)
编辑
收藏
评论
920357
#1楼
2007-10-09 23:20
天极[未注册用户]
◎这个clientid主要是为了防止页面存在同id的控件而已,这个你完全可以从datagrid的item模版列添加一个控件可以看出来!
在1.1下我同样写出了以下几个,给你参考看看
public static void PopupConfirm(System.Web.UI.Page mypage,string info,string YesURL,int Width,int Height)
{
string windowAttribs;
windowAttribs = "dialogHeight: "+Height.ToString()+"px; dialogWidth: "+Width.ToString()+"px;edge: Raised; center: Yes; help: No; resizable: No; status: No; scroll:No;";
info = info.Replace("\n","");
string strscript="<script language='javascript'>\n";
strscript += "input_box=confirm('"+ info +"');\n";
strscript += "if(input_box){window.showModalDialog('"+YesURL+"','','"+windowAttribs+"');}\n";
strscript += "</script>";
if(!mypage.IsStartupScriptRegistered("ConfirmMsg"))
mypage.RegisterStartupScript("ConfirmMsg", strscript);
}
public static void popUpWindow(System.Web.UI.Page mypage,string YesURL,int Width,int Height)
{
string windowAttribs;
windowAttribs = "dialogHeight: "+Height.ToString()+"px; dialogWidth: "+Width.ToString()+"px;edge: Raised; center: Yes; help: No; resizable: No; status: No; scroll:No;";
string strscript="<script language='javascript'>\n";
strscript += "window.showModalDialog('"+YesURL+"','','"+windowAttribs+"');\n";
strscript += "</script>";
if(!mypage.IsStartupScriptRegistered("ConfirmMsg"))
mypage.RegisterStartupScript("ConfirmMsg", strscript);
}
public static void OpenPopUp(System.Web.UI.WebControls.WebControl opener,string PagePath,string windowName,int Top,int Left,int width,int height)
{
string clientScript;
string windowAttribs;
windowAttribs = "left=" + Left.ToString() + "px," +
"top=" + Top.ToString() + "px," +
"width=" + width.ToString() + "px," +
"height=" + height.ToString() + "px," +
"left='+((screen.width -" + width.ToString()+ ") / 2)+',";
clientScript = "window.open('"+PagePath+ "','"+
windowName + "','"+ windowAttribs + "');return false;";
opener.Attributes.Add("onClick", clientScript);
}
public static void OpenPopUp(System.Web.UI.Page mypage,string PagePath,string windowName,int Top,int Left,int width,int height)
{
string clientScript;
string windowAttribs;
windowAttribs = "left=" + Left.ToString() + "px," +
"top=" + Top.ToString() + "px," +
"width=" + width.ToString() + "px," +
"height=" + height.ToString() + "px," +
"left='+((screen.width -" + width.ToString()+ ") / 2)+',";
clientScript = "<script language='javascript'> window.open('"+PagePath+ "','"+
windowName + "','"+ windowAttribs + "');</script>";
if(!mypage.IsStartupScriptRegistered("PopupWin"))
mypage.RegisterStartupScript("PopupWin", clientScript);
}
回复
引用
#2楼
2007-10-09 23:23
天极[未注册用户]
◎另外孟子e章上面也有类似的实现,说实在话,完全不需要3个页面来完成!
只要两个页面就ok了
回复
引用
#3楼
2007-10-10 00:28
琨[未注册用户]
这个还是用JS,只是调用.NET而已
回复
引用
#4楼
[
楼主
]
2007-10-10 08:49
旌浪
@天极
感謝你提供的方法,至於你說的只要兩個頁面即可完成,我並沒有弄懂,因為我曾將Default2.aspx去掉后,就出現瀏覽器說要關閉,按是的話,就會關閉頁面的。所以還是按照原來的用了一個Default2.aspx。
另外就是你上面的方法調用后,如何返回值回來?
回复
引用
查看
#5楼
2007-10-10 22:06
天极[未注册用户]
public static void showmessageRet(System.Web.UI.Page mypage,string info,string retVal)
{
info = info.Replace("\n","");
//string scriptClientId=string.Empty;
string strscript="<script language='javascript'>";
strscript += "alert('"+ info +"');";
strscript += "window.parent.returnValue=" + retVal + ";";
strscript += "window.close();";
strscript += "</script>";
if(!mypage.IsStartupScriptRegistered("ShowMsg"))
mypage.RegisterStartupScript("ShowMsg", strscript);
}
回复
引用
#6楼
[
楼主
]
2007-10-11 08:42
旌浪
@天极
謝謝指點。
回复
引用
查看
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
谷歌将出售Clearwire股份 不到收购价1/10
·
为什么Google比苹果更令微软恐惧?
·
思科拟2.71亿美元收购私有公司Lightwire
·
社交商务公司Bazaarvoice将于2月24日进行IPO
·
戴尔收购备份软件公司AppAssure
»
更多新闻...
最新知识库文章
:
·
领域模型管理与AOP
·
编程的艺术:漂亮的代码和漂亮的软件
·
GIT分支管理是一门艺术
·
编程:是一门艺术
·
编程是一门艺术吗?
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
公告
昵称:
凯锐
园龄:
5年11个月
粉丝:
3
关注:
0
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
.NET
(1)
WCF
(1)
Remoting
(1)
VS2008
(1)
自动更新
(1)
AutoUpdate
(1)
Update Selft
(1)
CrystalReport XI R2
(1)
CrystalReport 11
(1)
VS2005
(1)
更多
随笔分类
.Net Remoting(6)
(rss)
ASP.NET Design(9)
(rss)
C# Programing(22)
(rss)
Design & Pattern(3)
(rss)
English(1)
(rss)
Office VBA (3)
(rss)
Regular Expression(2)
(rss)
SQL Programing(15)
(rss)
Symbian(1)
(rss)
Ubuntu(1)
(rss)
VB.NET(5)
(rss)
個性人生(19)
(rss)
随笔档案
2010年5月 (1)
2009年7月 (1)
2009年2月 (2)
2008年12月 (1)
2008年7月 (1)
2008年4月 (1)
2007年11月 (1)
2007年10月 (3)
2007年8月 (1)
2007年6月 (1)
2007年5月 (1)
2007年3月 (1)
2007年1月 (1)
2006年12月 (3)
2006年11月 (5)
2006年10月 (8)
2006年9月 (12)
2006年8月 (5)
2006年7月 (3)
2006年6月 (27)
2006年5月 (4)
2006年4月 (3)
2006年3月 (6)
2006年2月 (9)
文章分类
C# Knowledge(9)
(rss)
CSDN上的強貼(2)
(rss)
Plugin(1)
(rss)
Sql Server2K5
(rss)
SqlKnowledge(8)
(rss)
Xml(1)
(rss)
感兴趣BLOG
『 天道酬勤 』
Excel IT
(rss)
用Excel很專注,很深度
Google Analytics
呂震宇
我的CSDN Blog
感兴趣Forum
51腳本
DEVDIV
(rss)
中文手機開發論壇
eggheadcafe
IT PUB
MSDN微軟中國
Nokia Forum
(rss)
開發視界
(rss)
中國DotNet論壇
開源社區
123aspx
C#Corner
C#Help
Codeproject
gfprge
Google CodeSearch
英語學習
Google Translator
天天學英語
育路教育社區
(rss)
中國教育第一社區
最新评论
阅读排行榜
评论排行榜
推荐排行榜