浅析ASP.NET MVC中的TempData机制

开发 后端
本文将介绍ASP.NET MVC中的TempData机制,这是一个字典类,作用是在Action执行过程之间传值。希望大家通过本文能学到如何用好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中的实现。

【编辑推荐】

  1. 技术高手讲评ASP.NET MVC 1.0
  2. 微软发布ASP.NET MVC框架1.0正式版(附下载地址)
  3. ASP.Net MVC框架配置与分析
责任编辑:彭凡 来源: cnblogs
相关推荐

2009-12-21 10:05:10

ASP.NET MVC

2009-07-31 12:43:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-08-03 18:35:51

ASP.NET数据缓存

2009-09-24 09:26:22

ASP.NET MVC

2009-07-20 10:33:02

ASP.NET MVC

2009-12-07 09:23:05

ASP.NET MVC

2010-03-26 09:16:44

2009-12-11 09:36:50

ASP.NET MVC

2009-07-27 10:18:12

TypeResolveASP.NET

2009-07-22 13:16:04

MvcAjaxPaneASP.NET MVC

2009-07-30 13:45:40

ASP.NET开发模式MVC模式

2009-11-02 10:15:53

ASP.NET MVC

2009-08-05 15:50:13

ASP.NET优点

2009-07-22 14:23:39

URL RewriteASP.NET

2009-08-10 14:38:29

ASP.NET组件设计

2010-03-12 09:38:58

2009-07-27 15:34:11

MembershipASP.NET

2009-07-24 13:20:44

MVC框架ASP.NET

2009-08-10 13:32:15

ASP.NET TimASP.NET组件设计
点赞
收藏

51CTO技术栈公众号