程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 深入分析ASP.NET Mvc 1.0 – 2

深入分析ASP.NET Mvc 1.0 – 2

編輯:關於ASP.NET

深入分析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();
     }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved