From b1d97f3ad5e9b3e64c21ad0d565d2d5921779788 Mon Sep 17 00:00:00 2001 From: Daniel Dabrowski Date: Thu, 13 Nov 2014 13:08:02 -0800 Subject: [PATCH] 20592: Fixing named routes support Work Item:20592 --- .../Mvc/RouteCollectionPublisherTests.cs | 11 +++++++++++ src/Orchard/Mvc/Routes/RoutePublisher.cs | 16 +++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Orchard.Tests/Mvc/RouteCollectionPublisherTests.cs b/src/Orchard.Tests/Mvc/RouteCollectionPublisherTests.cs index 4148ddca1..e6529452f 100644 --- a/src/Orchard.Tests/Mvc/RouteCollectionPublisherTests.cs +++ b/src/Orchard.Tests/Mvc/RouteCollectionPublisherTests.cs @@ -93,6 +93,17 @@ namespace Orchard.Tests.Mvc { Assert.That(where, Is.EqualTo("after")); action.EndInvoke(asyncResult); } + + [Test] + public void RouteDescriptorWithNameCreatesNamedRouteInCollection() { + _routes.MapRoute("foo", "{controller}"); + + var publisher = _container.Resolve(); + var routeDescriptor = Desc("yarg", "bar"); + publisher.Publish(new[] { routeDescriptor }); + + Assert.That(_routes["yarg"], Is.Not.Null); + } } } diff --git a/src/Orchard/Mvc/Routes/RoutePublisher.cs b/src/Orchard/Mvc/Routes/RoutePublisher.cs index f11e18d9b..73e9e2eaa 100644 --- a/src/Orchard/Mvc/Routes/RoutePublisher.cs +++ b/src/Orchard/Mvc/Routes/RoutePublisher.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Web.Http; using System.Web.Mvc; using System.Web.Routing; @@ -52,15 +53,19 @@ namespace Orchard.Mvc.Routes { preloading.Add(routeDescriptor.Name, routeDescriptor.Route); } - + using (_routeCollection.GetWriteLock()) { // existing routes are removed while the collection is briefly inaccessable _routeCollection .OfType() .ForEach(x => x.ReleaseShell(_shellSettings)); - - // new routes are added + + // HACK: For inserting names in internal dictionary when inserting route to RouteCollection. + var routeCollectionType = typeof (RouteCollection); + var namedMap = (Dictionary) routeCollectionType.GetField("_namedMap", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_routeCollection); + + // new routes are added foreach (var routeDescriptor in routesArray) { // Loading session state information. var defaultSessionState = SessionStateBehavior.Default; @@ -120,6 +125,11 @@ namespace Orchard.Mvc.Routes { } _routeCollection.Insert(index, matchedHubRoute); + + // HACK: For inserting names in internal dictionary when inserting route to RouteCollection. + if (!string.IsNullOrEmpty(matchedHubRoute.Name) && !namedMap.ContainsKey(matchedHubRoute.Name)) { + namedMap[matchedHubRoute.Name] = matchedHubRoute; + } } matchedHubRoute.Add(shellRoute, _shellSettings);