首页 / 网页编程 / ASP.NET / 深入分析ASP.NET Mvc 1.0 – 2
        
            深入分析ASP.NET Mvc 1.0 – 22011-03-26 博客园 Terry Sun深入分析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返回的ActionResultTempData.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();
     }