diff --git a/samples/WebHost/Controllers/Admin/Tasks/MaintenanceController.cs b/samples/WebHost/Controllers/Admin/Tasks/MaintenanceController.cs
index e10faa6..169e5a8 100644
--- a/samples/WebHost/Controllers/Admin/Tasks/MaintenanceController.cs
+++ b/samples/WebHost/Controllers/Admin/Tasks/MaintenanceController.cs
@@ -9,7 +9,7 @@ namespace Samples.Controllers.Admin.Tasks {
public class MaintenanceController : Controller {
public ActionResult Index() {
- throw new NotImplementedException();
+ return View();
}
}
}
\ No newline at end of file
diff --git a/samples/WebHost/Controllers/Admin/Tasks/TasksController.cs b/samples/WebHost/Controllers/Admin/Tasks/TasksController.cs
new file mode 100644
index 0000000..feb5f0e
--- /dev/null
+++ b/samples/WebHost/Controllers/Admin/Tasks/TasksController.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.Mvc;
+
+namespace Samples.Controllers.Admin.Tasks {
+
+ public class TasksController : Controller {
+
+ public ActionResult Index() {
+ return View();
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/WebHost/Samples.csproj b/samples/WebHost/Samples.csproj
index 7a4ec0f..92fa953 100644
--- a/samples/WebHost/Samples.csproj
+++ b/samples/WebHost/Samples.csproj
@@ -104,6 +104,7 @@
+
@@ -132,6 +133,8 @@
+
+
diff --git a/samples/WebHost/Views/Admin/Tasks/Index.aspx b/samples/WebHost/Views/Admin/Tasks/Index.aspx
new file mode 100644
index 0000000..23b83f6
--- /dev/null
+++ b/samples/WebHost/Views/Admin/Tasks/Index.aspx
@@ -0,0 +1,5 @@
+<%@ Page Language="C#" %>
+
+
+
+
diff --git a/samples/WebHost/Views/Admin/Tasks/Maintenance/Index.aspx b/samples/WebHost/Views/Admin/Tasks/Maintenance/Index.aspx
new file mode 100644
index 0000000..23b83f6
--- /dev/null
+++ b/samples/WebHost/Views/Admin/Tasks/Maintenance/Index.aspx
@@ -0,0 +1,5 @@
+<%@ Page Language="C#" %>
+
+
+
+
diff --git a/samples/WebHost/Views/Shared/UrlGenerationSamples.ascx b/samples/WebHost/Views/Shared/UrlGenerationSamples.ascx
index ad4378d..89abf95 100644
--- a/samples/WebHost/Views/Shared/UrlGenerationSamples.ascx
+++ b/samples/WebHost/Views/Shared/UrlGenerationSamples.ascx
@@ -42,12 +42,20 @@
- Url.Action("", "..Admin")
+ Url.Action("", "..")
|
- <%: Url.Action("", "~Admin") %> |
- <%: Url.Action("", "..Admin") %> |
+ (varies) |
+ <%: Url.Action("", "..") %> |
Parent reference. |
+
+
+ Url.Action("", "..User")
+ |
+ (varies) |
+ <%: Url.Action("", "..User") %> |
+ Sibling of parent reference. |
+
Url.Action("", "~Admin")
diff --git a/src/MvcCodeRouting/ICodeRoute.cs b/src/MvcCodeRouting/ICodeRoute.cs
index b62daea..8b5658f 100644
--- a/src/MvcCodeRouting/ICodeRoute.cs
+++ b/src/MvcCodeRouting/ICodeRoute.cs
@@ -16,6 +16,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using MvcCodeRouting.Controllers;
namespace MvcCodeRouting {
@@ -107,22 +108,24 @@ static class CodeRouteExtensions {
static string GetRouteContext(IDictionary values, IDictionary requestRouteValues, IDictionary requestRouteDataTokens, out string originalController) {
+ object origControllerObj;
originalController = null;
- if (values.ContainsKey("controller")) {
- originalController = (string)values["controller"];
+ if (values.TryGetValue("controller", out origControllerObj)) {
+ originalController = (string)origControllerObj;
}
- const string routeContextKey = "__routecontext";
+ object routeContextParamObj;
- if (values.ContainsKey(routeContextKey)) {
- return (string)values[routeContextKey];
+ if (values.TryGetValue("__routecontext", out routeContextParamObj)) {
+ return (string)routeContextParamObj;
}
-
+
+ object routeContextObj;
string routeContext = null;
- if (requestRouteDataTokens.ContainsKey(DataTokenKeys.RouteContext)) {
- routeContext = (string)requestRouteDataTokens[DataTokenKeys.RouteContext];
+ if (requestRouteDataTokens.TryGetValue(DataTokenKeys.RouteContext, out routeContextObj)) {
+ routeContext = (string)routeContextObj;
}
if (routeContext == null) {
@@ -176,6 +179,34 @@ static class CodeRouteExtensions {
routeContextSegments.RemoveAt(routeContextSegments.Count - 1);
theController.Remove(0, 2);
+
+ if (theController.Length == 0) {
+
+ object namespacesObj;
+ string[] namespaces;
+
+ if (requestRouteDataTokens.TryGetValue(DataTokenKeys.Namespaces, out namespacesObj)
+ && (namespaces = namespacesObj as string[]) != null
+ && namespaces.Length == 1) {
+
+ string[] namespaceSegments = namespaces[0].Split('.');
+ string nsLast = namespaceSegments[namespaceSegments.Length - 1];
+ string currentController = (string)requestRouteValues["controller"];
+
+ string parentController = nsLast;
+
+ if (ControllerInfo.NameEquals(nsLast, currentController)
+ && namespaceSegments.Length > 1) {
+
+ parentController = namespaceSegments
+ .Skip(namespaceSegments.Length - 2)
+ .Take(1)
+ .First();
+ }
+
+ theController.Append(parentController);
+ }
+ }
}
if (theController.Length > 1) {
@@ -208,15 +239,16 @@ static class CodeRouteExtensions {
}
originalValue = originalObject as string;
+ string mappedValue;
if (originalValue == null
|| mapping == null
- || !mapping.ContainsKey(originalValue)) {
+ || !mapping.TryGetValue(originalValue, out mappedValue)) {
return false;
}
- values[name] = mapping[originalValue];
+ values[name] = mappedValue;
return true;
}
|