From 005d3e7d64b8040a65fe33ff345e1e899b4cb273 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Tue, 19 Feb 2013 06:19:26 +0600 Subject: [PATCH] Removes area routing for local surface controllers and BeginUmbracoForm, adds strongly typed Html.Action method for rendering SurfaceController child actions regardless of area (so you don't have to specify). All relates to #U4-1727 --- src/Umbraco.Web/HtmlHelperRenderExtensions.cs | 46 ++++++++++++++++++- src/Umbraco.Web/Mvc/RenderRouteHandler.cs | 4 +- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs index 12a5d6d736..4e7f06cf06 100644 --- a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs +++ b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs @@ -6,6 +6,7 @@ using System.Text; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Html; +using System.Web.Routing; using Umbraco.Core; using Umbraco.Core.Dynamics; using Umbraco.Web.Mvc; @@ -83,6 +84,48 @@ namespace Umbraco.Web return filteredHtmlHelper.ValidationSummary(excludePropertyErrors, message, htmlAttributes); } + /// + /// Returns the result of a child action of a strongly typed SurfaceController + /// + /// + /// + /// + /// + public static IHtmlString Action(this HtmlHelper htmlHelper, string actionName) + where T : SurfaceController + { + return htmlHelper.Action(actionName, typeof(T)); + } + + /// + /// Returns the result of a child action of a SurfaceController + /// + /// + /// + /// + /// + /// + public static IHtmlString Action(this HtmlHelper htmlHelper, string actionName, Type surfaceType) + { + Mandate.ParameterNotNull(surfaceType, "surfaceType"); + Mandate.ParameterNotNullOrEmpty(actionName, "actionName"); + + var routeVals = new RouteValueDictionary(new {area = ""}); + + var surfaceController = SurfaceControllerResolver.Current.RegisteredSurfaceControllers + .SingleOrDefault(x => x == surfaceType); + if (surfaceController == null) + throw new InvalidOperationException("Could not find the surface controller of type " + surfaceType.FullName); + var metaData = PluginController.GetMetadata(surfaceController); + if (!metaData.AreaName.IsNullOrWhiteSpace()) + { + //set the area to the plugin area + routeVals.Add("area", metaData.AreaName); + } + + return htmlHelper.Action(actionName, metaData.ControllerName, routeVals); + } + #region BeginUmbracoForm /// @@ -307,7 +350,7 @@ namespace Umbraco.Web Mandate.ParameterNotNullOrEmpty(action, "action"); Mandate.ParameterNotNull(surfaceType, "surfaceType"); - var area = Umbraco.Core.Configuration.GlobalSettings.UmbracoMvcArea; + var area = ""; var surfaceController = SurfaceControllerResolver.Current.RegisteredSurfaceControllers .SingleOrDefault(x => x == surfaceType); @@ -366,7 +409,6 @@ namespace Umbraco.Web object additionalRouteVals, IDictionary htmlAttributes) { - Mandate.ParameterNotNullOrEmpty(area, "area"); Mandate.ParameterNotNullOrEmpty(action, "action"); Mandate.ParameterNotNullOrEmpty(controllerName, "controllerName"); diff --git a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs index c1df3fb48e..bba31be513 100644 --- a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs @@ -176,8 +176,6 @@ namespace Umbraco.Web.Mvc /// The original route definition that would normally be used to route if it were not a POST private IHttpHandler HandlePostedValues(RequestContext requestContext, PostedDataProxyInfo postedInfo, RouteDefinition routeDefinition) { - var standardArea = Umbraco.Core.Configuration.GlobalSettings.UmbracoMvcArea; - //set the standard route values/tokens requestContext.RouteData.Values["controller"] = postedInfo.ControllerName; requestContext.RouteData.Values["action"] = postedInfo.ActionName; @@ -185,7 +183,7 @@ namespace Umbraco.Web.Mvc IHttpHandler handler = new MvcHandler(requestContext); //ensure the controllerType is set if found, meaning it is a plugin, not locally declared - if (!postedInfo.Area.InvariantEquals(standardArea)) + if (!postedInfo.Area.IsNullOrWhiteSpace()) { //requestContext.RouteData.Values["controllerType"] = postedInfo.ControllerType; //find the other data tokens for this route and merge... things like Namespace will be included here