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