快速业务通道

深入分析ASP.NET Mvc 1.0 – 2

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

深入分析ASP.NET Mvc 1.0 – 2. Controller.Execute(Request)-TempDataDictionary的Load与Save操作

Controller最终是通过调用ControllerBase类的Execute(RequestContext)方法来完成 一个Action的创建与执行操作,代码如下:

protected virtual void Execute(RequestContext requestContext)  {
       if (requestContext == null) {
         throw new ArgumentNullException("requestContext");
       }

       Initialize(requestContext);
       ExecuteCore();
     }

代码分为两步:

Initialize(requestContext): 创建ControllerContext类的一个实例。

ExecuteCore(): 加载TempData, 创建及执行Action,处理Action返回的ActionResult ,保存TempData数据。

ExecuteCore()的代码如下:

protected override void ExecuteCore() {
       TempData.Load(ControllerContext,  TempDataProvider);

       try {
         string actionName = RouteData.GetRequiredString ("action");
         if (!ActionInvoker.InvokeAction(ControllerContext,  actionName)) {
           HandleUnknownAction(actionName);
         }
       }
       finally {
         TempData.Save(ControllerContext, TempDataProvider);
       }
     }

代码又分为三个部分:

TempData.Load(ControllerContext, TempDataProvider): 从 HttpContextBase.Session中加载TempData数据

ActionInvoker.InvokeAction(ControllerContext, actionName): 创建,执行Action ,并处理Action返回的ActionResult

TempData.Save(ControllerContext, TempDataProvider): 保存TempData

第1,第3部分都是对TempData的操作,下面的文字将详细介绍这两个步骤。

1. TempData.Load(ControllerContext, TempDataProvider)

TempDataProvider: 就是SessionStateTempDataProvider,他是一个继承了 ITempDataProvider接口的Session辅助类

TempDataProvider.Load的源码:

public void Load(ControllerContext controllerContext,  ITempDataProvider tempDataProvider) {
       IDictionary<string, object> providerDictionary =  tempDataProvider.LoadTempData(controllerContext);
       _data = (providerDictionary != null) ? new  Dictionary<string, object>(providerDictionary,  StringComparer.OrdinalIgnoreCase) : 
         new Dictionary<string, object> (StringComparer.OrdinalIgnoreCase);
       _initialKeys = new HashSet<string>(_data.Keys);
       _modifiedKeys.Clear();
     }

这里就是加载TempData的全部过程:

调用SessionStateTempDataProvider中的LoadTempData(…)方法并近回一个 IDictionary<string, object>对象

初始化_data对象,如果providerDictionary不是null那么把providerDictionary中的 数据存放到_data对象中,其实这个_data就是TempData用来保存数据的容器,初始化 _initialKeys对象并将_data中的全部Key值放入其中,它用来缓存已加载的Key值,如果 对TempData中插入新数据时,_initialKeys对象中的数据不会有任务变化

清除_modifiedKeys中的值,用来保存TempData新的Key值,当有一个新的键值对插入 到TempData中,这个key值会被保存到_modifiedKeys对象中

再来深入tempDataProvider.LoadTempData(controllerContext)方法,其实就是 Se

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号