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);
}