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