[转帖]Asp.NET 弹出页面
原文链接:http://www.cnblogs.com/adi-liu/archive/2008/07/18/1246091.html
今天碰到一个弹出对话框(PopUp dialog)的问题, 因该是个傻瓜问题, 但是还是让我研究了半天, 总结了一些前人经验, 拿出来跟大家分享一下!
在ASP.Net中页面之间的传值方法有很多,但是打开和关闭新的窗口,靠的还是JavaScript 下的 Windows对象譬如打开窗口open(<URL字符串>, <窗口名称字符串>, <参数字符串>);
<URL字符串>:描述所打开的窗口打开哪一个网页。如果留空(''),则不打开任意网页。
<窗口名称字符串>:描述被打开的窗口的名称(window.name),可以使用'_top'、'_blank'等内建名称。这里的名称跟“<a href="..." target="...">”里的“target”属性是一样的。
<参数字符串>:描述被打开的窗口的样貌。如果只需要打开一个普通窗口,该字符串留空(''),如果要指定样貌,就在字符串里写上一到多个参数,参数之间用逗号隔开。
有些参数还是要知道的
top=# |
窗口顶部离开屏幕顶部的像素数 |
left=# |
窗口左端离开屏幕左端的像素数 |
width=# |
窗口的宽度 |
height=# |
窗口的高度 |
menubar=... |
窗口有没有菜单,取值yes或no |
toolbar=... |
窗口有没有工具条,取值yes或no |
location=... |
窗口有没有地址栏,取值yes或no |
directories=... |
窗口有没有连接区,取值yes或no |
scrollbars=... |
窗口有没有滚动条,取值yes或no |
status=... |
窗口有没有状态栏,取值yes或no |
resizable=... |
窗口给不给调整大小,取值yes或no |
close() 关闭一个已打开的窗口。
window.close() 或 self.close():关闭本窗口;
<窗口对象>.close():关闭指定的窗口。
如果该窗口有状态栏,调用该方法后浏览器会警告:“网页正在试图关闭窗口,是否关闭?”然后等待用户选择是否;如果没有状态栏,调用该方法将直接关闭窗口。
至于opener他应该是window的属性而非方法
用法:window.opener;返回打开本窗口的窗口对象。注意:返回的是一个窗口对象。如果窗口不是由其他窗口打开的,在 Netscape 中这个属性返回 null;在 IE 中返回“未定义”(undefined)。undefined 在一定程度上等于 null。注意:undefined不是 JavaScript 常数,如果你企图使用“undefined”,那就真的返回“未定义”了。
在这里就有个问题了,怎们后面说….(卖个关子)
OK, 窗口现在是打开了, 接下来我们想要做什么?
一, 在新的页面上得到一个或多个值, 之后传递下去?
这种情况下,JavaScript就不是唯一的最佳选择了, 虽然在传统的ASP当中form Post是上加之选,但在ASP.NET中就显得有些老土了,并且实现起来有些麻烦! ASP.NET为我们提供了多种方式,
QueryString, Session, Server.Transfer, Cache, ViewState
一种是可以通过用来传送相应的值,再一种是通过变量来传送相应的值,还有就是通过方法来实现。下面分别一一介绍:
1. Querystring (较古老)
Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象。还有就是URL需要自行设计,容易出错. 不过如果你想传递一个安全性不是那么太重要或者是一个简单的数值时,用此方法还是可取的。
简单的例子就是在父级页面中
string url;
url="webform2.aspx?name=" +
TextBox1.Text + "&email=" +
TextBox2.Text;
Response.Redirect(url);
在第二个页面的page_load中加入
Label1.Text=Request.QueryString["name"];
Label2.Text=Request.QueryString["email"];
运行,即可看到传递后的结果了。
2. Session
使用Session变量传值是一种最常见的方式了,此中方式不仅可以把值传递到下一个页面,还可以交叉传递到多个页面,直至把Session变量的值removed后,变量才会消失。不过问题是,两个页面之间最好还是使用局部变量。否则可能会有项目组中Session命名冲突的问题。再就是记得用完后remove掉.
简单的例子就是在父级页面中加入
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Response.Redirect("webform2.aspx");
在第二个页面的page_load中加入
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
运行,即可看到传递后的结果了。
3. Server.Transfer
虽然这种方法有点复杂,但也不失为一种在页面传值的方式。Server.Transfer的方法居然有很多人说好,这种方法要求被调用的页面去引用调用的页面,这种方法明显违反编程的原则。原来被调用的页面可以独立使用,可以被其他页面调用,用了这种方法就不行了!没有深度研究, 就不显摆了.
4. Cache
在ASP.NET页面和ASP.NET用户控件(动态装入)之间传递数据时.在ASP.NET页面中装入用户控件的时候
Cache[“Test“] =“Test“
在用户控件的Page_Load方法中:
Label1.Text = Page.Page.Cache[“Test“].ToString;
Label1应该显示为“Test”
5. ViewState
ViewState适用在一个页面中保存状态,要在两个页面之间使用似乎也不行。(没有深度研究)
二, 在新的页面上得到一个或多个值后,传回父级页面?
这个问题在我看来,JavaScript是个不二之选,
在父级页面中
<head runat="server">中添加
<script type='text/javascript'>
function openWindow()
{
window.open('Popup.aspx','_blank','height=450,width=470,status=no,toolbar=no,menubar=no,scrollbars=no,location=no');
}
</script>
<form id="form1" runat="server">中添加
<div>
<asp:TextBox ID="TB_subject" runat="server"></asp:TextBox>
<asp:TextBox ID="TB_Infor" runat="server"></asp:TextBox>
<p>
<input type="button" value="传值并返回父窗口" name="button1" onclick="popup()" /></p>
</div>
当然也可以写在code里,写法如下
Dim PopUpDialog As String
PopUpDialog = "<script type='text/javascript'>window.open('Popup.aspx','_blank','height=450,width=470,status=no,toolbar=no,menubar=no,scrollbars=no,location=no');</script>"
ScriptManager.RegisterStartupScript(Me, Me.GetType, "key", PopUpDialog, False)
PopUp页面当中
<head runat="server">中添加
<script type="text/javascript">
function popup()
{
window.opener.document.getElementById("TB_subject").value=document.getElementById("TB_Name").value;
window.opener.document.getElementById("TB_Info").value=document.getElementById("TB_Summary").value;
window.close()
}
</script>
<form id="form1" runat="server">中添加
<div>
<asp:TextBox ID="TB_Name" runat="server"></asp:TextBox>
<asp:TextBox ID="TB_Summary" runat="server"></asp:TextBox>
<p>
<input type="button" value="传值并返回父窗口" name="button1" onclick="popup()" /></p>
</div>
之后在触发对象(input,button etc…)上添加onclick="popup()" 事件即可, 当然在ASP.NET中如果应用了VB或C#Code这句话应当改为OnClientClick="popup()".
好了解释一下前面卖的关子,这里需要注意几个问题,
1. window.opener.document.getElementById("TB_Name").value这句话虽然可以用window.opener.document.all["TB_Name"].value代替,但是它只对IE有效,在firefox中或其他浏览器是没有结果的,因为事实上document没有all这个方法getElementById或getElementByName才是正解.
2. 如果使用了ASP.NET 2.0 AJAX, 并且把xhtml tag对象写入Code的时候,记得用ScriptManager.RegisterStartupScript(Me, Me.GetType, "key", PopUpDialog, False) 替代Response.Write(script); 因为在ScriptManager控件里不支持Response.Write()
[转帖]Asp.NET 弹出页面的更多相关文章
- [转帖]ASP.NET的版本?
ASP.NET的版本? https://www.cnblogs.com/guogangj/p/8526365.html 问题源于这么一本书: <ASP.NET 4 解密(卷1)>,这本书大 ...
- [转帖]Asp.Net MVC EF各版本区别
Asp.Net MVC EF各版本区别 https://www.cnblogs.com/liangxiaofeng/p/5840754.html 2009年發行ASP.NET MVC 1.0版 201 ...
- [转帖]ASP.NET Core的Kestrel服务器
ASP.NET Core的Kestrel服务器 https://cloud.tencent.com/developer/article/1023247 在这篇文章中: 何时使用Kestrel和反向代理 ...
- [转帖]ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解 https://www.cnblogs.com/vipyoumay/p/7525478.html ASP.NET C ...
- [转帖] ASP ASPX 等知识
asp.asp.net..aspx..ascx..ashx的简单说明 https://www.cnblogs.com/jhcelue/p/6736147.html ASP是动态server页面(Act ...
- [转帖]ASP.NET Core 中间件(Middleware)详解
ASP.NET Core 中间件(Middleware)详解 本文为官方文档译文,官方文档现已非机器翻译 https://docs.microsoft.com/zh-cn/aspnet/core/ ...
- [转帖]Asp.net MVC 与 Asp.net Web API 区别
Asp.net MVC 与 Asp.net Web API 区别 https://www.cnblogs.com/viktor988/ https://www.cnblogs.com/terry283 ...
- 调试ASP.NET网站IIS环境问题解决方法汇总
调试网站时出现错误,错误如下: 1. 分析器错误消息: 创建 RewriterConfig 的配置节处理程序时出错: 无法生成临时类(result=1).error CS2001: 未能找到源文件“C ...
- NodeJS旅程 : express - nodejs MVC 中的王牌
express 正如ASP.NET MVC 在作为.net平台下最佳的 Mvc框架的地位一样,express在 node.js 环境也有着相同的重要性.在百度上 "nodejs expres ...
随机推荐
- 2876: [Noi2012]骑行川藏 - BZOJ
Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...
- tomcat 优化实记
好记性不如烂笔头,以下是 tomcat 无脑优化 1.内存设置(VM参数调优)(1). Windows环境下,是tomcat解压版(执行startup.bat启动tomcat) 解决办法:修改“%T ...
- C# IL DASM 使用
IL DASM反编译工具 使用C#的猿人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认识.我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改.感觉他还是很强大. IL ...
- POJ 1922 Ride to School(贪心+模拟)
题意:起点与终点相隔4500米.现Charley 需要从起点骑车到终点.但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑.而当他遇到以更快的速度骑车的人时,他会以相应的速度跟上 ...
- [STL]单词转换
如果单词转换文件的内容是: 'em themcuz becausegratz grateful i Inah nopos ...
- SQLMap使用
http://www.freebuf.com/articles/web/29942.html http://sqlmap.org/ http://blog.csdn.net/zgyulongfei/a ...
- zoj 3599 Game 博弈论
K倍动态减法游戏!!! 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4683 代码如下: #include<ios ...
- Linux Versus Windows, Ubuntu/Mint V XP/Vista/7
原文:http://petermoulding.com/linux_versus_windows_ubuntu_mint_v_xp_vista_7 Linux Versus Windows, Ubun ...
- php规范
PSR-0 自动加载 PSR-1 基本代码规范 PSR-2 代码样式 PSR-3 日志接口
- Swift入门(十一)——类型转换与is、as操作
三种操作:is.as?和as! Swift是强类型语言,但也允许开发者通过is.as?和as!这三种操作来对类型进行判断和强制转换.其中is用作类型判断,而as?和as!则分别是类型转换的可选形式和强 ...