惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
H
Help Net Security
量子位
The Cloudflare Blog
博客园 - Franky
博客园 - 聂微东
博客园 - 司徒正美
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
罗磊的独立博客
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
MongoDB | Blog
MongoDB | Blog

博客园 - Sangplus

[转]C#单进程解决方案 extern alias 英语面试常用语 【转】FLASH轮换广告源码 走马灯的js代码 让Enumerable可以具有each方式的语法。 C#之扩展方法学习 使用非托管代码进行字节数组的快速拷贝 c#复习——虚方法、重写方法和抽象方法(官方解释) vs2005工具栏重置 所有HTTP状态代码及其定义 ASP.NET验证控件祥解[转] C#制作WinForm控件[转] 关于web.config的读写管理 关于SqlServer2005开发者版不同电脑之间的连接问题 JavaScript中有时候需要给this起一个别名。 不知不觉代码已经超过1万行了 关于RequiredFieldValidator的怪异现象 javascript添加下拉列表和速度有关系吗?
一种实用的页面传参方法
Sangplus · 2008-10-28 · via 博客园 - Sangplus

        做项目的过程中,经常会遇到页面传参的问题。对于简单的参数传递,我相信大家都会处理,直接在新页面的URL后添加诸如name=sangplus&age=18形式的参数变量就行了。然而一般我们遇到的问题可能要比这个棘手一些,我们解决这些问题的方法也可能有很多种,但对于初学者来说,往往无所选择。下面我介绍一种自己摸索的方法,虽然在某些方面还有一些局限性,不过我相信已经可以很好的解决你的问题了。

  •  方法原理及代码

首先,从System.Web.UI.Page继承一个类BasePage作为其它页面的基类,BasePage定义两个hashTable类型的属性TargetParams和SourceParams,分别用Session和ViewState来存储,它们代表调用页面中要传递的参数集合和接收页面中要接收的参数集合。然后BasePage覆写System.Web.UI.Page的OnLoad方法,当第一次进入页面的时候,把Session的内容赋给ViewState,并清空Session中的相应内容。

然后,在需要传参的页面直接调用基类的属性即可。

BasePage的代码如下:

  

Code

 

发送参数页面PageA的后台代码

Code

(其中myClass自定义类型,是被传递的参数类型)

Code

接收参数页面PageB的后台代码

Code

页面,参数,基类之间的关系图如下 

  • 方法特点
  • 实用性好:我想大家在用Url进行参数传递的时候,遇到的问题主要是两类:一是中文等参数的编解码问题,二是复杂类型参数(如自定义类型)的传递问题。而通过我们的方法可以很好的解决这个问题,因而该方法应该能解决大家在进行参数传递时遇到的大部分问题,相信大家理解了以后会经常应用该方法的。

  • 使用方法简单:在Redirect之前, 把参数放入TargetParams中。在接收页面中直接从SourceParams中取出参数。不需要进行过多的编码,解码等操作。

  • 安全性也不错:因为不用在客户端的Url里面放参数字符串,因而客户端不能直接看到参数内容,参数内容的安全性由M$内建的ViewState来支持,大家应该可以放心。

  • 性能也不错:虽然该方法使用了Session,但是由于Session仅在Redirect跳转之前才使用,而在第一进入新页面的时候,Session的内容已经被清空。因而客户在浏览网页内容的时候,服务器上的Session其实是没有存放参数内容的,从而不会给服务器带来任何压力。

  • 注意事项

  • 由于要把参数放入ViewState,因而要求被传递的参数可序列化。关于这一点,c#的基础数据类型都没有问题,简单的自定义类型,大家可参考上面例子中的myClass类,只要在类定义前放一句[Serializable]即可,复杂的自定类型,只要实现了ISerializable接口也是没有任何问题的。

  • 由于参数传递以后,新页面会把参数放入ViewState中,而ViewState在服务器和客户端之间的传输也是要占用一部分网络资源的,因而请大家尽量不要传递数据量很大的参数,如DataSet等。

     该方法仅是工作中自己的一个心得,Baidu了半天也没见别人说出个好的方法,所以发出来以供大家参考。限于本人水平,文中可能有很多地方说的不对,欢迎各位高手批评指正。