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; }