From f45d4a84f7c7a33c326a3df9451fa701ab03b880 Mon Sep 17 00:00:00 2001 From: VWA Software internet Date: Tue, 19 Apr 2022 14:04:11 +0200 Subject: [PATCH] =?UTF-8?q?Include=20the=20PluginController=20Area=20when?= =?UTF-8?q?=20searching=20for=20matching=20surface=E2=80=A6=20(#12218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Routing/ControllerActionSearcher.cs | 22 ++++++++++++++++--- .../Routing/IControllerActionSearcher.cs | 6 +++++ .../Routing/UmbracoRouteValueTransformer.cs | 2 +- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.Website/Routing/ControllerActionSearcher.cs b/src/Umbraco.Web.Website/Routing/ControllerActionSearcher.cs index 5c758a948cbf..bf7c0aff5965 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 @@ public class ControllerActionSearcher : IControllerActionSearcher _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) => 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) + 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 @@ public ControllerActionDescriptor Find(HttpContext httpContext, string contro return null; } + /// /// Return a list of controller candidates that match the custom controller and action names /// @@ -54,7 +63,8 @@ public ControllerActionDescriptor Find(HttpContext httpContext, string contro 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 @@ public ControllerActionDescriptor Find(HttpContext httpContext, string contro [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 b272b4afd369..1b50638fffe3 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 60384de752ba..bb00f958cf00 100644 --- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs +++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs @@ -240,7 +240,7 @@ private RouteValueDictionary HandlePostedValues(PostedDataProxyInfo postedInfo, [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) {