ASP.NET 弹出对话框和页面之间传递值的经验总结

来源:互联网 发布:get什么意思网络用语 编辑:程序博客网 时间:2024/05/17 03:03

今天碰到一个弹出对话框(PopUp dialog)的问题, 因该是个傻瓜问题, 但是还是让我研究了半天, 总结了一些前人经验, 拿出来跟大家分享一下!
在ASP.Net中页面之间的传值方法有很多,但是打开和关闭新的窗口,靠的还是JavaScript 下的 Windows对象譬如打开窗口

open(<URL字符串>, <窗口名称字符串>, <参数字符串>);<URL字符串>:描述所打开的窗口打开哪一个网页。如果留空(''),则不打开任意网页。<窗口名称字符串>:描述被打开的窗口的名称(window.name),可以使用'_top''_blank'等内建名称。这里的名称跟“<a href="..." target="...">”里的“target”属性是一样的。<参数字符串>:描述被打开的窗口的样貌。如果只需要打开一个普通窗口,该字符串留空(''),如果要指定样貌,就在字符串里写上一到多个参数,参数之间用逗号隔开。有些参数还是要知道的top=#窗口顶部离开屏幕顶部的像素数left=#窗口左端离开屏幕左端的像素数width=#窗口的宽度height=#窗口的高度menubar=...窗口有没有菜单,取值yes或notoolbar=...窗口有没有工具条,取值yes或nolocation=...窗口有没有地址栏,取值yes或nodirectories=...窗口有没有连接区,取值yes或noscrollbars=...窗口有没有滚动条,取值yes或nostatus=...窗口有没有状态栏,取值yes或noresizable=...窗口给不给调整大小,取值yes或noclose() 关闭一个已打开的窗口。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. ViewStateViewState适用在一个页面中保存状态,要在两个页面之间使用似乎也不行。(没有深度研究)二, 在新的页面上得到一个或多个值后,传回父级页面?这个问题在我看来,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.getElementByIdx_x("TB_subject").value=document.getElementByIdx_x("TB_Name").value;      window.opener.document.getElementByIdx_x("TB_Info").value=document.getElementByIdx_x("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.getElementByIdx_x("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()
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝发烧40多度怎么办 7岁宝宝发烧了怎么办 宝宝反复发烧39度怎么办 一岁半宝宝反复发烧39度怎么办 七岁发烧38度怎么办 小孩一直37度1怎么办 婴儿一直37度多怎么办 1岁半高烧39度怎么办 反复发烧39度多怎么办 孩子不爱喝水怎么办%3f 8岁儿童不爱喝水怎么办 儿子14岁了不爱说话怎么办 我孩子长得老慢怎么办 老公嫌你烦了怎么办 2岁宝宝吃饭不嚼怎么办 2岁宝宝挑食厌食怎么办 孩子不爱和家长交流怎么办 孩子发烧在医院查不出病因怎么办 宝宝乳牙长歪了怎么办 两岁宝宝不爱吃水果怎么办 两岁宝宝不吃水果怎么办 一岁的宝宝上火了怎么办 吃水果嘴唇肿了怎么办 二岁宝宝不爱吃饭怎么办 小婴儿便秘但不爱喝水怎么办 宝宝只吃水果不吃饭怎么办 一岁宝宝不喜欢吃水果怎么办 1岁宝宝不吃水果怎么办 一岁半宝宝吃水果拉肚子怎么办 大人发烧了怎么办如何退烧 怀孕后不爱吃水果怎么办 不敢吃水果了怕虫怎么办 宝宝发烧38度不出汗怎么办 1岁宝宝喜欢含饭怎么办 3岁宝宝喜欢含饭怎么办 孩子咳嗽发烧怎么办最有效 孩子咳嗽打哈切流鼻涕发烧怎么办 孩子香蕉吃多了怎么办 80多岁老人发烧怎么办 小孩香蕉吃多了怎么办 7个月宝宝缺钙怎么办