快速业务通道

深入分析ASP.NET Mvc 1.0 – 2

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
ssionStateTempDataProvider类中的LoadTempData(…)方法:

public virtual IDictionary<string, object> LoadTempData (ControllerContext controllerContext) {
       HttpContextBase httpContext =  controllerContext.HttpContext;

       if (httpContext.Session == null) {
         throw new InvalidOperationException (MvcResources.SessionStateTempDataProvider_SessionStateDisabled);
       }

       Dictionary<string, object> tempDataDictionary =  httpContext.Session[TempDataSessionStateKey] as Dictionary<string,  object>;

       if (tempDataDictionary != null) {
         // If we got it from Session, remove it so that  no other request gets it
         httpContext.Session.Remove(TempDataSessionStateKey);
         return tempDataDictionary;
       }
       else {
         return new Dictionary<string, object> (StringComparer.OrdinalIgnoreCase);
       }
     }

SessionStateTempDataProvider类中定义了一个常量,用它来作为保存在Session中 TempData对象的Key。

internal const string TempDataSessionStateKey =  "__ControllerTempData";

在LoadTempData(…)方法中,首先在Session中查找与key相对应的 Dictionary<string, object>对象,如果Session中存在这个对象,那么就清除 Session中的这个键值对并返回找到的 Dictionary<string, object>对象,否则创 建一个新的Dictionary<string, object>对象并返回。

这里的重点就是httpContext.Session.Remove(TempDataSessionStateKey) 方法,这 也是TempData的特点,即同一个TempData只能被传递一次。当在Session中找到TempData 后立即将它从Session中清除掉,下一次执行LoadTempData(…)方法时绝不会再找到同一 个TempData。

再次说明:只要将一个键值对放入到TempData中,不论是同一个Controller中的不同 Action,还是不同Controller中的不同Action都可以接收到这个TempData,但是仅此一次 ,当程序再次提交回服务端后是绝不可能再获得同样的值的TempData对象,因为它已经在 Session中被清除掉。

2. TempData.Save(ControllerContext, TempDataProvider)

这是整个Controller.Execute(…)生命周期中最后一个操作,它的作用是保存新的 TempData到HttpContext.Base.Session中。Save方法的具体代码:

public void Save(ControllerContext controllerContext,  ITempDataProvider tempDataProvider) {
       if (_modifiedKeys.Count > 0) {

         // Apply change tracking. 
         foreach (string x in _initialKeys) {
           if (!_modifiedKeys.Contains(x)) {
             _data.Remove(x);
           }
         }

         // Store the dictionary 
         tempDataProvider.SaveTempData(controllerContext,  _data);
       }
     }

上面提到过_initialKeys和_modifiedKeys的重要性,它们的作用在这里将体现出来,

_initialKeys: 保存在Action执行之前TempData中的全部Key值,如果在action执行过 程中有新的键值对插入到TempData中,对_initialKeys对象中的值不会有任何影响。

_modifiedKeys: 在Action执行过程中,如果有新

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号