From b532569eb4817ba70ba716233f87360bd6c43939 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Thu, 25 Nov 2010 22:04:12 -0800 Subject: [PATCH] Unblocking the use of Html.RenderAction and Html.Action in Orchard views --HG-- branch : dev --- src/Orchard/Mvc/Html/ContainerExtensions.cs | 7 +--- src/Orchard/WorkContextExtensions.cs | 41 ++++++++++++++++----- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/Orchard/Mvc/Html/ContainerExtensions.cs b/src/Orchard/Mvc/Html/ContainerExtensions.cs index 0e104904d..035947e99 100644 --- a/src/Orchard/Mvc/Html/ContainerExtensions.cs +++ b/src/Orchard/Mvc/Html/ContainerExtensions.cs @@ -9,13 +9,10 @@ namespace Orchard.Mvc.Html { /// /// himself public static TService Resolve(this HtmlHelper html) { - var workContextAccessor = html.ViewContext.RouteData.DataTokens["IWorkContextAccessor"] as IWorkContextAccessor; - if (workContextAccessor == null) - throw new ApplicationException("Unable to resolve"); + var workContext = html.ViewContext.RequestContext.GetWorkContext(); - var workContext = workContextAccessor.GetContext(html.ViewContext.HttpContext); if (workContext == null) - throw new ApplicationException("Unable to resolve"); + return default(TService); return workContext.Resolve(); } diff --git a/src/Orchard/WorkContextExtensions.cs b/src/Orchard/WorkContextExtensions.cs index 3b4956805..1c1b6d690 100644 --- a/src/Orchard/WorkContextExtensions.cs +++ b/src/Orchard/WorkContextExtensions.cs @@ -10,27 +10,48 @@ namespace Orchard { } public static WorkContext GetWorkContext(this RequestContext requestContext) { - if (requestContext == null) { + if (requestContext == null) return null; - } var routeData = requestContext.RouteData; - object value; - if (routeData == null || - routeData.DataTokens == null || - !routeData.DataTokens.TryGetValue("IWorkContextAccessor", out value) || - !(value is IWorkContextAccessor)) { + if (routeData == null || routeData.DataTokens == null) return null; + + object workContextValue; + if (!routeData.DataTokens.TryGetValue("IWorkContextAccessor", out workContextValue)) { + workContextValue = FindWorkContextInParent(routeData); } - var workContextAccessor = (IWorkContextAccessor)value; + if (!(workContextValue is IWorkContextAccessor)) + return null; + + var workContextAccessor = (IWorkContextAccessor)workContextValue; return workContextAccessor.GetContext(requestContext.HttpContext); } - public static WorkContext GetWorkContext(this ControllerContext controllerContext) { - if (controllerContext == null) { + private static object FindWorkContextInParent(RouteData routeData) { + object parentViewContextValue; + if (!routeData.DataTokens.TryGetValue("ParentActionViewContext", out parentViewContextValue) + || !(parentViewContextValue is ViewContext)) { return null; } + + var parentRouteData = ((ViewContext)parentViewContextValue).RouteData; + if (parentRouteData == null || parentRouteData.DataTokens == null) + return null; + + object workContextValue; + if (!parentRouteData.DataTokens.TryGetValue("IWorkContextAccessor", out workContextValue)) { + workContextValue = FindWorkContextInParent(parentRouteData); + } + + return workContextValue; + } + + public static WorkContext GetWorkContext(this ControllerContext controllerContext) { + if (controllerContext == null) + return null; + return WorkContextExtensions.GetWorkContext(controllerContext.RequestContext); }