使用Cross-Page Postback(跨页面提交)在页面间传递数据
页面间传递数据的几种方法
在页面间传递数据时,我们有以下几种选择:
1、Query String
一个很常见的方法,Query String是URL中问号之后的那一部分。其优点在于它是轻量级的,不会给服务器带来任何负担。而它也有几个缺点:传递的信息仅限于简单的字符串,而且必须是合法的URL字符;信息是对用户是可见的,因而存在安全性问题;用户可能会尝试手动修改查询字符串,这可能是程序未预料到或不能防范的;很多浏览器对URL的长度都有所限制(通常为1KB到2KB)。
2、Cookie
Cookie是创建在客户端硬盘上(或者,如果它们是临时的,则在内存中)的小文件。其优点在于使用时不易被用户察觉,可被程序中每个页面使用,并且可将数据长期保存。但它也有一些与Query String 相同的缺点:仅限于简单的字符串信息;一旦用户找到了相应的文件,它们也是易于访问和阅读的。所以Cookie最好不要用于保存复杂的或私密的信息。
3、Session
可以在源页面中将数据保存在Session中,然后在目标页面中读取这些数据。注意:将大量的信息存储在Session中会严重影响服务器的性能。
4、Server.Transfer
要进行服务器端的重定向,可以使用Server.Transfer。因为在服务器端执行,Server.Transfer方法不需要请求另一页面。使用HttpContext,我们可以在目标页面中访问源页面中的数据。其缺点是,浏览器并不了解返回给它的是另外一个页面,它在地址栏中会显示第一个页面的URL,这会让用户陷入混乱,在他们使用书签的时候也会产生麻烦。所以不推荐该方法。
5、其它
还可以使用缓存(Cache)来存储数据,可在程序的任意处访问缓存。建议仅对那些修改不太频繁但经常使用的数据使用缓存。 另外在某些特定情况下还可以使用Application变量,如统计页面的点击数等。
使用Cross-Page Postback
ASP.NET 2.0中引入了一个新的方法:跨页面提交,即postback触发在另一个页面。这种技术听起来很是简单,但却存在隐患。一不小心,就会导致你创建的页面紧密耦合,难以维护和调试。
支持跨页面提交的机制是一个名为PostBackUrl的属性,该属性由IButtonControl接口定义,实现这个接口的按钮控件包括ImageButton,LinkButton,Button。将PostBackUrl属性值设置为另一个web窗体的名称(即URL),当用户点击按钮时,页面将被提交到新的URL。
看下面这个示例,该示例包括源页面CrossPage1.aspx和目标页面CrossPage2.aspx:
CrossPage1.aspx
<head runat="server">
<title>Source Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
FirstName: <asp:TextBox runat="server" ID="txtFirstName"></asp:TextBox>
<br />
LastName: <asp:TextBox runat="server" ID="txtLastName"></asp:TextBox>
<br />
<asp:Button runat="server" ID="cmdSubmit" PostBackUrl="~/CrossPage2.aspx" Text="Cross-Page Postback" />
</div>
</form>
</body>
</html>
CrossPage1.aspx不包含任何代码,效果如下:
现在点击按钮,该页面就被提交到CrossPage2.aspx了。此时CrossPage2.aspx页面可以使用Page.PreviousPage属性与CrossPage1.aspx进行交互了,下面这个事件处理函数演示了如何获取源页面的标题并显示它:
{
lblInfo.Text = "You came from a page titled " + PreviousPage.Header.Title;
}
注意:该方法在访问PreviousPage对象前先对其作了null检查,如果结果为false,表明没有跨页面提交发生,也就是说,CrossPage2.aspx是被直接请求的,或者由其自身提交,此时PreviousPage对象不可用。
从源页面中获取更多数据
上面那个示例作了一个有趣的尝试,但仅仅如此,我们还是不能传递任何有用的信息。
要获取源页面中控件的值,可以使用FindControl方法:
{
lblInfo.Text = "You came from a page title " + PreviousPage.Header.Title;
string firstName = (PreviousPage.FindControl("txtFirstName") as TextBox).Text;
string lastName = (PreviousPage.FindControl("txtLastName") as TextBox).Text;
lblInfo.Text += "<br />";
lblInfo.Text += "your full name: " + firstName + " " + lastName;
}
要获得更多信息,我们需要将PreviousPage引用转换为适当的页面类(本示例中是CrossPage1类):
{
CrossPage1 prevPage = PreviousPage as CrossPage1;
if (prevPage != null)
{
// 此时可以访问源页面的公共属性
}
}
另外,除了在代码中进行类型转换,还可以在.aspx页面中添加PreviousPageType指示字:
<%@ PreviousPageType VirtualPath="~/CrossPage1.aspx" %>
此时,PreviousPage属性会自动使用CrossPage1类型,编辑器中的智能提示也可以使用了。但是这种方法相当脆弱,因为你只能使用一个页面类!因此,出于灵活性考虑,使用类型转换的方法会更好。
好了,不管怎样,现在已经将PreviousPage对象转换为合适的页面类型了,但是你还是不能直接访问它包含的控件对象。这是因为这些控件都被声明为保护类型(protected),此时的解决方案是使用属性。
比如,如果希望公开源页面上两个文本框控件的值,可以添加属性来封装控件对象,如在CrossPage1类中添加属性:
{
get { return txtFirstName; }
}
public TextBox LastNameTextBox
{
get { return txtLastName; }
}
但是,这通常不是最好的方法。其问题在于它公开了太多的细节,目标页面可以读取文本框控件的所有内容了。如果过段时间需要修改源页面,决定使用不同的输入控件,维护这些属性就相当困难了,因为你不得不修改两个页面的代码。
更好的方法是定义更具体的属性,它们应当仅仅提供你需要的东西。比如,你可以考虑添加一个FullName属性,该属性读取两个文本框的值:
{
get { return this.txtFirstName.Text + " " + this.txtLastName.Text; }
}
这样做,两个页面的关系就变得清晰、简单并易于维护了。如果你决定在CrossPage1中使用新的输入控件,只要修改CrossPage1页面就好了。CrossPage2中的代码也相应地修改如下:
{
lblInfo.Text = "You came from a page titled " + PreviousPage.Header.Title + "<br />";
CrossPage1 prevPage = PreviousPage as CrossPage1;
if (prevPage != null)
{
lblInfo.Text += "You typed in this: " + prevPage.FullName;
}
}
下面是CrossPage2的最终结果:
跨页面提交确实非常有用,但它们也会使页面变得复杂。如果你允许多个源页面提交到同一目标页面,你就得编写代码逻辑以判断页面来自何处,然后作出相应处理。要避免这种烦恼,简单的方法就是只在两个特定的页面间使用它。
By Anders Cui
参考:
Beginning.ASP.NET.2.0.in.C.Sharp.2005.From.Novice.to.Professional by Matthew MacDonald
使用Cross-Page Postback(跨页面提交)在页面间传递数据相关推荐
- 【鸿蒙 HarmonyOS】界面跳转 ( Page Ability 的 action 标识 | Page Ability 之间的界面跳转及传递数据 | 鸿蒙工程下创建 Module | 代码示例 )
文章目录 一.Page Ability 的 action 标识 二.Page Ability 之间的界面跳转及传递数据 三.鸿蒙工程下创建 Module 四.代码示例 五.执行效果 参考文档 : Pa ...
- StoryBoard学习(5):使用segue页面间传递数据
StoryBoard学习(5):使用segue页面间传递数据 函数: C代码 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:( ...
- js关闭当前页面提交父页面
//提交父页面 function submitParent() {var index=parent.layer.getFrameIndex(window.name); //获取当前窗口的namepar ...
- php 数据分别是怎么传的_四种php页面间传递数据方法
我们定义page01.php和page02.php两个php文件,将page01中的内容想办法传递到page02,然后供我们继续使用. 第一种: 使用客户端浏览器的cookie.cookie很容易理解 ...
- react-native页面间传递数据的几种方式
1. 利用react-native 事件DeviceEventEmitter 监听广播 应用场景: - 表单提交页面, A页面跳转到B页面选人, 然后返回A页面, 需要将B页面选择的数据传回A页面. ...
- 如何在微信小程序的页面间传递数据?
知晓程序注: 我们在之前发布过小程序页面传值方法的 ,说明了在小程序开发中,两种常见的页面之间传值方法. 本期,「知晓程序」为你带来的是「倒数记日」小程序开发者带来的,小程序开发中,有关页面间数据传递 ...
- Windows Phone 几种页面间传递数据的方式
首先,我们要引用:using Microsoft.Phone.Shell; 第一种: // 导航到新页面 NavigationService.Navigate(new Uri("/Detai ...
- java 两个页面传递数据,请问Cookie怎么在两个页面间传递数据?
参考代码如下: //如果请求的Cookie对象为空 if (Request.Cookies["userCookie"] == null) { //创建一个Cookie对象 Http ...
- 浅谈ASP中Web页面间的数据传递
[简 介] 基于Web的动态网页设计必会涉及到页面间的数据传递,文章探讨了ASP设计中常用的Web页面间的数据传递方式,分析各种数据传递方式的使用方法.使用场合及优缺点,其都是设计阶段选择数据传递方式 ...
最新文章
- C专家编程--读书笔记六 运行时数据结构
- 数组方法 包含es6
- oracle time model,通过案例学调优之--OracleTimeModel(时间模型)
- 全是大事:百度华为联手搞AI;滴滴再融40亿美元也说搞AI
- linux下tomcat启动后出现多个java进程
- 澜舟科技开源轻量级中文语言预训练模型——孟子模型
- 类成员函数可以返回该类的实例吗_关于类的理解
- html range样式修改,自定义(滑动条)input[type=range]样式
- Algs4-2.4.5给出以下字母顺序插入大堆的结果
- 了解常见的开源协议(BSD, GPL, LGPL,MIT)涉及到GNU,LINUX,自由软件(免费开源),开源软件(自由免费开源和商业结合允许二次开发闭源),免费软件(免费使用不开源代码)
- java项目大概多少张表,要把数据插入到多张表?该如何处理
- 李开复:搞无人车在电车难题上论争个没完,这样子不行的
- 带你了解磁盘驱动程序(xv6)
- qnx限制ssh连接的数量
- 大天使黎明服务器维护,亲爱的玩家: 您好,为保证服务
- android 记事本ppt,基于Android记事本软件设计与实现.ppt
- android音频管理器(AudioManager)
- mac安装nvm报错 :HTTP/2 stream 1 was not closed cleanly before end of the underlying stream 解决方案
- 慕课面板数据分析与Stata应用—第一章总结
- 电脑如何快速打开其它磁盘文件夹?
热门文章
- 学习笔记9-C语言-传参、类型限定符、递归
- leetcode585. 2016年的投资(SQL)
- leecode62 不同路径
- 算法(13)-leetcode-explore-learn-数据结构-链表小结
- 《Python Cookbook 3rd》笔记(1.20):合并多个字典或映射
- python从小白到大牛百度云盘_Java从小白到大牛 (关东升著) 中文pdf+mobi版[36MB]
- 解决ipfs 出现Error: can‘t publish while offline: pass `--allow-offline` to override的问题
- Springboot整合缓存
- 英语口语 week12 Thursday
- C++ primer 第10章 泛型算法