From 1757f04787b5f64b4bc5842e582915d74a2669cc Mon Sep 17 00:00:00 2001 From: Uncled1023 Date: Mon, 28 Jun 2021 21:34:01 -0700 Subject: [PATCH] Fixed routing not matching default values --- Utilities/Routing/EndpointHelper.cs | 2 +- Utilities/Routing/SubdomainRoute.cs | 106 ------------------- Utilities/Routing/SubdomainRouteExtension.cs | 41 ------- Utilities/Routing/UrlExtensions.cs | 13 ++- 4 files changed, 12 insertions(+), 150 deletions(-) delete mode 100644 Utilities/Routing/SubdomainRoute.cs delete mode 100644 Utilities/Routing/SubdomainRouteExtension.cs diff --git a/Utilities/Routing/EndpointHelper.cs b/Utilities/Routing/EndpointHelper.cs index 26f03ac..94f7a0f 100644 --- a/Utilities/Routing/EndpointHelper.cs +++ b/Utilities/Routing/EndpointHelper.cs @@ -30,7 +30,7 @@ namespace Teknik.Utilities.Routing var defaults = mapping.Defaults as JObject; foreach (var defaultVal in defaults) { - defaultObj.TryAdd(defaultVal.Key, defaultVal.Value); + defaultObj.TryAdd(defaultVal.Key, defaultVal.Value.ToObject()); } } defaultObj.TryAdd("area", mapping.Area); diff --git a/Utilities/Routing/SubdomainRoute.cs b/Utilities/Routing/SubdomainRoute.cs deleted file mode 100644 index 9e4a307..0000000 --- a/Utilities/Routing/SubdomainRoute.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using System.Web; -using Microsoft.AspNetCore.Routing; -using Teknik.Utilities; - -namespace Teknik.Utilities.Routing -{ - public class SubdomainRoute : Route - { - private readonly IRouter _target; - - public List Subdomains { get; set; } - - public List Domains { get; set; } - - public SubdomainRoute(List subdomains, List domains, IRouter router, string routeTemplate, IInlineConstraintResolver inlineConstraintResolver) - : base(router, routeTemplate, inlineConstraintResolver) - { - this.Subdomains = subdomains; - this.Domains = domains; - this._target = router; - } - - public SubdomainRoute(List subdomains, List domains, IRouter router, string routeTemplate, RouteValueDictionary defaults, IDictionary constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver) - : base(router, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver) - { - this.Subdomains = subdomains; - this.Domains = domains; - this._target = router; - } - - public SubdomainRoute(List subdomains, List domains, IRouter router, string routeName, string routeTemplate, RouteValueDictionary defaults, IDictionary constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver) - : base(router, routeName, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver) - { - this.Subdomains = subdomains; - this.Domains = domains; - this._target = router; - } - - protected override Task OnRouteMatched(RouteContext context) - { - // Only look at the subdomain if there is any route data. - if (context.RouteData != null) - { - string subdomain = context.HttpContext.Request.Query["sub"]; // A subdomain specified as a query parameter takes precedence over the hostname. - string host = context.HttpContext.Request.Headers["Host"]; - - if (host != null) - { - string domain = host.GetDomain(); - string curSub = host.GetSubdomain(); - - // special consideration for 'dev' subdomain - if (subdomain == null || subdomain == "dev") - { - if (!string.IsNullOrEmpty(curSub) && curSub == "dev") - { - // if we are on dev, and the param is dev or empty, we need to initialize it to 'www' - subdomain = "www"; - } - } - - if (subdomain == null) - { - subdomain = curSub; - } - else - { - if (context.RouteData.Values["sub"] == null) - { - context.RouteData.Values["sub"] = subdomain; - } - else - { - subdomain = context.RouteData.Values["sub"].ToString(); - } - } - - // Check if this route is valid for the current domain - if (context.HttpContext.Request.IsLocal() || Domains.Contains(domain)) - { - // Check if this route is valid for the current subdomain ('*' means any subdomain is valid) - if (Subdomains.Contains("*") || Subdomains.Contains(subdomain)) - { - context.RouteData.Values["sub"] = subdomain; - context.RouteData.Routers.Add(_target); - return _target.RouteAsync(context); - } - } - } - } - return Task.CompletedTask; - } - - public override VirtualPathData GetVirtualPath(VirtualPathContext context) - { - object subdomainParam = context.HttpContext.Request.Query["sub"]; - if (subdomainParam != null && context.Values["sub"] == null) - context.Values["sub"] = subdomainParam; - return base.GetVirtualPath(context); // we now have the route based on subdomain - } - } -} \ No newline at end of file diff --git a/Utilities/Routing/SubdomainRouteExtension.cs b/Utilities/Routing/SubdomainRouteExtension.cs deleted file mode 100644 index 6a7e1c3..0000000 --- a/Utilities/Routing/SubdomainRouteExtension.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Configuration; -using System.Collections.Generic; - -namespace Teknik.Utilities.Routing -{ - public static class SubdomainRouteExtension - { - public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List subDomains, List domains, string template, object defaults) - { - return MapSubdomainRoute(routeBuilder, name, subDomains, domains, template, defaults, new { }, new { }); - } - - public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List subDomains, List domains, string template, object defaults, object constraints) - { - return MapSubdomainRoute(routeBuilder, name, subDomains, domains, template, defaults, constraints, new { }); - } - - public static SubdomainRoute MapSubdomainRoute(this IRouteBuilder routeBuilder, string name, List subDomains, List domains, string template, object defaults, object constraints, object dataTokens) - { - var inlineConstraintResolver = routeBuilder.ServiceProvider.GetRequiredService(); - - SubdomainRoute route = new SubdomainRoute( - subDomains, - domains, - routeBuilder.DefaultHandler, - name, - template, - new RouteValueDictionary(defaults), - new RouteValueDictionary(constraints), - new RouteValueDictionary(dataTokens), - inlineConstraintResolver); - - routeBuilder.Routes.Add(route); - - return route; - } - } -} \ No newline at end of file diff --git a/Utilities/Routing/UrlExtensions.cs b/Utilities/Routing/UrlExtensions.cs index c2c5fcf..c27436b 100644 --- a/Utilities/Routing/UrlExtensions.cs +++ b/Utilities/Routing/UrlExtensions.cs @@ -9,6 +9,7 @@ using System.Web; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.AspNetCore.Routing; +using Newtonsoft.Json.Linq; namespace Teknik.Utilities.Routing { @@ -57,10 +58,18 @@ namespace Teknik.Utilities.Routing // Get the endpoint mapping var mapping = EndpointHelper.GetEndpointMapping(routeName); - if (mapping != null && - !routeValueDict.ContainsKey("area")) + if (mapping != null) { routeValueDict.TryAdd("area", mapping.Area); + + if (mapping.Defaults != null) + { + var defaults = mapping.Defaults as JObject; + foreach (var defaultVal in defaults) + { + routeValueDict.TryAdd(defaultVal.Key, defaultVal.Value.ToObject()); + } + } } var path = linkGen.GetPathByAddress(url.ActionContext.HttpContext, routeName, routeValueDict);