ASP.NET MVC中的两个Action之间值的传递--TempData

一. ASP.NET MVC中的TempData

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

如:

 1 public ActionResult Index()
 2 {
 3     this.TempData["MyNane"] = "XiaoMing";
 4     return View();
 5 }
 6 public ActionResult Index2()
 7 {
 8      string MyName=this.TempData["MyNane"] as string;
 9      return View();
10 }

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

二. TempData的生命周期

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

 1 protected override void ExecuteCore()
 2 {
 3     TempData.Load(ControllerContext, TempDataProvider);
 4     try
 5     {
 6         string actionName = RouteData.GetRequiredString("action");
 7         if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
 8         {
 9             HandleUnknownAction(actionName);
10         }
11     }
12     catch (Exception)
13     {
14
15         TempData.Save(ControllerContext, TempDataProvider);
16     }
17 }

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

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

TempData.Load()

1 public void Load(ControllerContext controllerContext, ITempDataProvider tempDataProvider)
2 {
3     IDictionary<string, object> providerDictionary = tempDataProvider.LoadTempData(controllerContext);
4     _data = (providerDictionary != null) ? new Dictionary<string, object>(providerDictionary, StringComparer.OrdinalIgnoreCase) :
5         new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
6     _initialKeys = new HashSet<string>(_data.Keys);
7     __modifiedKeys.Clear();
8 }

TempData.Save()

 1 public void Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider)
 2 {
 3     if (_modifiedKeys.Count > 0)
 4     {
 5
 6         // Apply change tracking.
 7         foreach (string x in _initialKeys)
 8         {
 9             if (!_modifiedKeys.Contains(x))
10             {
11                 _data.Remove(x);
12             }
13         }
14
15         // Store the dictionary
16         tempDataProvider.SaveTempData(controllerContext, _data);
17         _modifiedKeys.Clear();
18     }
19 }

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

三. ITempDataProvider

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

 1 public ITempDataProvider TempDataProvider
 2 {
 3     get
 4     {
 5         if(_tempDataProvider==null){
 6             _tempDataProvider = new SessionStateTempDataProvider();
 7         }
 8         return _tempDataProvider;
 9     }
10     set
11     {
12         _tempDataProvider = value;
13     }
14 }

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

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

ITempDataProvider接口定义非常简单:

1  public interface ITempDataProvider
2         {
3             IDictionary<string, object> LoadTempData(ControllerContext controllerContext);
4             void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values);
5         }

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

时间: 2024-12-11 00:07:16

ASP.NET MVC中的两个Action之间值的传递--TempData的相关文章

Android中在两个Activity之间进行数据传递

首先声明,此篇文章是我原先的CSDN上面的博客,由于种种原因,不想再使用csdn博客,于是就将其文章搬至现在的cnblog. 大家好,今天我终于开通了自己的博客,很开心能和大家共同分享我的学习经验,希望我们可以共同进步哦,废话不多说了,看一下我今天学习android遇到的一些问题和解决办法吧 首先先把我使用的eclipse的版本贴出来:adt-bundle-windows-x86-20130917 这是一个集成的版本,不需要配置SDK和ADT,但是需要手动配置JDK哦! 其实,不同版本的ecli

[转]Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法

Partial 和RenderPartial:这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上 @Html.Partial("ViewName") RenderPartial 回传的是void, 而这个方法会在主页面上添加指定的View @{            Html.RenderPartial("V

Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法【转发】

Partial 和RenderPartial:这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上 @Html.Partial("ViewName") RenderPartial 回传的是void, 而这个方法会在主页面上添加指定的View @{            Html.RenderPartial("V

Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法

Partial 和RenderPartial:这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上 @Html.Partial("ViewName") RenderPartial 回传的是void, 而这个方法会在主页面上添加指定的View @{            Html.RenderPartial("V

ASP.NET MVC 中 @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction 的区别

1.带有Render的方法返回值是void,在方法内部进行输出:不带的返回值类型为MvcHtmlString,所以这样使用:    @Html.Partial 对应 @{Html.RenderPartial(....);}    @Html.Action 对应 @{Html.RenderAction(....);} 2.Action.RenderAction加载方法的视图,执行Controller → Model → View的顺序,然后把产生的页面带回到原来的View中再回传.而Partial

ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式

方式一: 数据存储模型Model:此方式未用到数据存储模型Model,仅简单的字符串string型数据传递 前台接收显示数据视图View: <div style="height:300px; width:100%"> <div style="margin-left:100px;margin-top:50px;"> <input id="testData" type="text" style=&qu

asp.net mvc中如何处理字符串与对象之间的序列化与反序列化(一)

前台我们一般用ajax来发送数据到后端进行处理,如果json数据结构和后台的实体类结构一致,就直接可以反序列化为指定的对象进行操作,非常方便. 前端发送的json数据结构: 后端实体结构: [csharp] view plain copy public partial class Cures { public string CureID { get; set; } public string MainCureSubjectID { get; set; } public string MainCu

NHibernate中Session与ASP.NET MVC中Action的综合使用

NHibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在NHibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Session管理下才能同步到数据库, 但是这里的Session并非指HttpSession,可以理解为基于ADO.NET的Connnection,Session是NHibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关,首先,我们需要知道, SessionFact

在ASP.NET MVC 中获取当前URL、controller、action 、参数

URL的获取很简单,ASP.NET通用:[1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名+页面名+参数: string url=Request.RawUrl;(或 string url=Request.Url.PathAndQuery;) [3]获取 虚拟目录名+页面名:string url=HttpContext.Current.Request.Url.AbsolutePath;(或