From 697aa03758d62e1194887639efa41b4a4ef13ed8 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 30 Aug 2013 11:34:02 +1000 Subject: [PATCH] Fixes U4-1339 SurfaceController returning PartialView - cannot use ModelState - TempData merge correctly. --- src/Umbraco.Web/Mvc/UmbracoPageResult.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web/Mvc/UmbracoPageResult.cs b/src/Umbraco.Web/Mvc/UmbracoPageResult.cs index fa009a9c46..9ae5006d48 100644 --- a/src/Umbraco.Web/Mvc/UmbracoPageResult.cs +++ b/src/Umbraco.Web/Mvc/UmbracoPageResult.cs @@ -25,27 +25,33 @@ namespace Umbraco.Web.Mvc var routeDef = (RouteDefinition)context.RouteData.DataTokens["umbraco-route-def"]; + var targetController = ((Controller)routeDef.Controller); + var sourceController = ((Controller) context.Controller); + //ensure the original template is reset context.RouteData.Values["action"] = routeDef.ActionName; //ensure ModelState is copied across - routeDef.Controller.ViewData.ModelState.Merge(context.Controller.ViewData.ModelState); + routeDef.Controller.ViewData.ModelState.Merge(sourceController.ViewData.ModelState); //ensure TempData and ViewData is copied across - foreach (var d in context.Controller.ViewData) + foreach (var d in sourceController.ViewData) routeDef.Controller.ViewData[d.Key] = d.Value; + //We cannot simply merge the temp data because during controller execution it will attempt to 'load' temp data // but since it has not been saved, there will be nothing to load and it will revert to nothing, so the trick is // to Save the state of the temp data first then it will automatically be picked up. // http://issues.umbraco.org/issue/U4-1339 - context.Controller.TempData.Save(context, ((Controller)context.Controller).TempDataProvider); - + targetController.TempDataProvider = sourceController.TempDataProvider; + targetController.TempData = sourceController.TempData; + targetController.TempData.Save(sourceController.ControllerContext, sourceController.TempDataProvider); + using (DisposableTimer.TraceDuration("Executing Umbraco RouteDefinition controller", "Finished")) { try { - ((IController)routeDef.Controller).Execute(context.RequestContext); + ((IController)targetController).Execute(context.RequestContext); } finally {