Welcome 微信登录

首页 / 网页编程 / 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返回的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();
}