ASP.NET MVC TempData机制分析


开发环境:Windows 2008, VS 2008 SP1, ASP.NET MVC 1.0

  一. ASP.NET MVC中的TempData

  在ASP.NET MVC框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictionary,顾名思义是一个字典类。TempData在ASP.NET MVC中的作用是:可用于在Action执行过程之间传值。简单的说,你可以在执行某个Action的时候,将数据存放在TempData中,那么在下一次Action执行过程中可以使用TempData中的数据。

  如:

  上面的代码中,Index()给TempData添加了一个键值对,假设我们先请求Index这个Action,接着请求Index2这个Action,那么在Index2中,我们便可以得到之前添加到TempData的键值对。有趣的是,这时如果再次请求Index2,那么从TempData中读到的MyName的值会是null。于是,我们需要了解TempData的生命周期。

  二. TempData的生命周期

  我们知道Http是无状态的,为什么TempData可以在两次请求之前传递数据呢?很明显,这个数据必定是已某种形式保存了。查看Controller类的源代码,很容易的找到了我们想要的东西:

  从上面的代码可以看出,每次在执行Action之前,都要调用一下TempData.Load()方法,执行完Action之后,再调用一下TempData.Save()方法。另外这里还有一个重要成员TempDataProvider。

  阅读了相关源代码之后,真相大白了。

  TempData.Load()

 

  TempData.Save()

 

  TempDataProvider用于暂存数据。在TempData.Load()方法中,TempDataProvider中保存的数据会被读到TempData中,供Action调用过程中使用。Action执行完后,TempData.Save()所作的事情则是,移除TempData中任何没有被更新的键值对,然后再将TempData中的数据保存,供下一次调用使用(注:也就是说,只有更新过的,以及新添加的键值对才能再下次request中继续使用)。为什么TempData中的数据需要迅速被清除呢?很简单,节约内存嘛。

  三. ITempDataProvider

  前面提到的TempDataProvider是Controller的一个Property,它的定义是这样的:

  这里我们看到了一个默认实现的SessionStateTempDataProvider类。也就是说,默认情况下,ASP.NET MVC通过SessionStateTempDataProvider来保存TempData的数据。很明显,数据是存在Session中的,也就是说,如果你禁用SessionState,那么你的页面就报异常了。

  ASP.NET MVC生来就是被设计为易扩展的,我们可以很容易通过实现自己的ITempDataProvider类来替换这个默认的SessionStateTempDataProvider。需要注意的是,TempDataProvider存放的数据必需具有用户独立性。

  ITempDataProvider接口定义非常简单:

  在MvcFutures中,你也可以找到一个CookieTempDataProvider,提供了将TempData存储在Cookie中的实现。



相关阅读:
javascript下计数器每秒自动加1
SQLServer 2008中SQL增强之三 Merge(在一条语句中使用Insert,Update,Delete)
random()方法和pow()方法
用VMware GSX和W2K 群集服务实现Exchange群集
js 弹出菜单/窗口效果
制作网页的5条非常不错的建议
Oracle的sql语句练习题含答案(二
PHP与SQL注入攻击[三]
CSS标示导航条当前所在频道
Linux终端图形库 Curses简介和实例分析
教你解决Windows 7操作系统中软件乱码问题
jQuery是JavaScript框架:13款非常有用的jQuery插件
关于echo 的问题与使用说明
织梦CMS调用问答栏目文章到首页实现方法分享
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 古色沉香 幼儿园教师入党转正申请书_入党转正申请书 美“挑战者”号航天飞机升空后爆炸(转载) 告密的事 结婚纪念日,一直很喜欢一句话:幸福不问出身,快乐都是自找的 爱情经典语录:现在要一份纯粹的爱情,很难 相信—不变的开始 黑色(三)作文1200字 金山湖秋游记 丑女的生活事件薄作文400字 今年的烟火晚会作文250字 *消防部队精神文明创建工作纪实 愚蠢的见识作文600字 世界气象日国旗下讲话稿:共建美丽中国,从我做起 百姓故事:庄稼汉咬老婆 小学六年级作文600字:乔利军历险记第二部(太阳神诞生之迷) 音乐随想 爱上一个不回家的男人 网上乱打油 岁末思绪 深入实践“三个代表”齐心共创美好未来为把建设成为全面小康社会而努力奋斗──在中 初中生入团申请书范本精编 镇财政所去年上半年工作总结 没有人,会无缘无故出现在你的生命里 未来福尔摩斯 新学期教师演讲稿 最新119消防宣传日广播稿 小学跳蚤市场活动方案 局管控效益年活动经验互交会上的讲话 金紫荆广场 【醉美、】山东淄博中铁二十局实习感悟 阴阳爱 夜一个人的旋律作文 叶芝《当你老了》中英文对照版 浅谈全面开展建设项目水资源论证 促进天津市水资源可持续利用 在学习贯彻中央一号文件专题培训会上的讲话 初中初一作文700字:春天的魔术 一个可以安放灵魂的地方 爱在心里藏作文800字 我真苦恼 我的姐姐作文1000字 幸亏只中二等奖 2015支教个人总结 小学五年级作文450字:说大话的小公鸡 恐龙历险记1000字 高中高三作文6150字:雪花的旅程 书香做伴作文900字 不想回家作文700字 小学六年级作文550字:珍惜 最后的时光 书到用时作文500字

Copyright © 2016 phpStudy |