diff --git a/src/Umbraco.Web.Website/Routing/ControllerActionSearcher.cs b/src/Umbraco.Web.Website/Routing/ControllerActionSearcher.cs
index 5c758a948c..bf7c0aff59 100644
--- a/src/Umbraco.Web.Website/Routing/ControllerActionSearcher.cs
+++ b/src/Umbraco.Web.Website/Routing/ControllerActionSearcher.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Http;
@@ -31,13 +32,20 @@ namespace Umbraco.Cms.Web.Website.Routing
_actionSelector = actionSelector;
}
+
///
/// Determines if a custom controller can hijack the current route
///
/// The controller type to find
- public ControllerActionDescriptor Find(HttpContext httpContext, string controller, string action)
+ public ControllerActionDescriptor Find(HttpContext httpContext, string controller, string action) => Find(httpContext, controller, action, null);
+
+ ///
+ /// Determines if a custom controller can hijack the current route
+ ///
+ /// The controller type to find
+ public ControllerActionDescriptor Find(HttpContext httpContext, string controller, string action, string area)
{
- IReadOnlyList candidates = FindControllerCandidates(httpContext, controller, action, DefaultActionName);
+ IReadOnlyList candidates = FindControllerCandidates(httpContext, controller, action, DefaultActionName, area);
if (candidates.Count > 0)
{
@@ -47,6 +55,7 @@ namespace Umbraco.Cms.Web.Website.Routing
return null;
}
+
///
/// Return a list of controller candidates that match the custom controller and action names
///
@@ -54,7 +63,8 @@ namespace Umbraco.Cms.Web.Website.Routing
HttpContext httpContext,
string customControllerName,
string customActionName,
- string defaultActionName)
+ string defaultActionName,
+ string area = null)
{
// Use aspnetcore's IActionSelector to do the finding since it uses an optimized cache lookup
var routeValues = new RouteValueDictionary
@@ -62,6 +72,12 @@ namespace Umbraco.Cms.Web.Website.Routing
[ControllerToken] = customControllerName,
[ActionToken] = customActionName, // first try to find the custom action
};
+
+ if (area != null)
+ {
+ routeValues[AreaToken] = area;
+ }
+
var routeData = new RouteData(routeValues);
var routeContext = new RouteContext(httpContext)
{
diff --git a/src/Umbraco.Web.Website/Routing/IControllerActionSearcher.cs b/src/Umbraco.Web.Website/Routing/IControllerActionSearcher.cs
index b272b4afd3..1b50638fff 100644
--- a/src/Umbraco.Web.Website/Routing/IControllerActionSearcher.cs
+++ b/src/Umbraco.Web.Website/Routing/IControllerActionSearcher.cs
@@ -1,3 +1,4 @@
+using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Controllers;
@@ -5,6 +6,11 @@ namespace Umbraco.Cms.Web.Website.Routing
{
public interface IControllerActionSearcher
{
+
ControllerActionDescriptor Find(HttpContext httpContext, string controller, string action);
+
+ ControllerActionDescriptor Find(HttpContext httpContext, string controller, string action, string area)
+ => Find(httpContext, controller, action);
+
}
}
diff --git a/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs b/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs
index 60384de752..bb00f958cf 100644
--- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs
+++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs
@@ -240,7 +240,7 @@ namespace Umbraco.Cms.Web.Website.Routing
[ActionToken] = postedInfo.ActionName
};
- ControllerActionDescriptor surfaceControllerDescriptor = _controllerActionSearcher.Find(httpContext, postedInfo.ControllerName, postedInfo.ActionName);
+ ControllerActionDescriptor surfaceControllerDescriptor = _controllerActionSearcher.Find(httpContext, postedInfo.ControllerName, postedInfo.ActionName, postedInfo.Area);
if (surfaceControllerDescriptor == null)
{