diff --git a/src/Umbraco.Web/Mvc/UmbracoPageResult.cs b/src/Umbraco.Web/Mvc/UmbracoPageResult.cs
index 6b44959c8c..f0904c64a4 100644
--- a/src/Umbraco.Web/Mvc/UmbracoPageResult.cs
+++ b/src/Umbraco.Web/Mvc/UmbracoPageResult.cs
@@ -27,8 +27,6 @@ namespace Umbraco.Web.Mvc
{
controller = CreateController(context, factory, routeDef);
- controller.ViewData.ModelState.Merge(context.Controller.ViewData.ModelState);
-
CopyControllerData(context, controller);
ExecuteControllerAction(context, controller);
@@ -73,14 +71,29 @@ namespace Umbraco.Web.Mvc
}
///
- /// Ensure TempData and ViewData is copied across
+ /// Ensure ModelState, ViewData and TempData is copied across
///
private static void CopyControllerData(ControllerContext context, ControllerBase controller)
{
+ controller.ViewData.ModelState.Merge(context.Controller.ViewData.ModelState);
+
foreach (var d in context.Controller.ViewData)
controller.ViewData[d.Key] = d.Value;
- controller.TempData = context.Controller.TempData;
+ //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
+
+ var targetController = controller as Controller;
+ var sourceController = context.Controller as Controller;
+ if (targetController != null && sourceController != null)
+ {
+ targetController.TempDataProvider = sourceController.TempDataProvider;
+ targetController.TempData = sourceController.TempData;
+ targetController.TempData.Save(sourceController.ControllerContext, sourceController.TempDataProvider);
+ }
+
}
///