Beispiel #1
0
        public static void IncomingMapping(this ICodeRoute route, IDictionary <string, object> values)
        {
            if (route.ControllerMapping != null)
            {
                string controller = values["controller"] as string;

                if (controller != null)
                {
                    values["controller"] = route.ControllerMapping
                                           .Single(p => String.Equals(p.Value, controller, StringComparison.OrdinalIgnoreCase))
                                           .Key;
                }
            }

            if (route.ActionMapping != null)
            {
                string action = values["action"] as string;

                if (action != null)
                {
                    values["action"] = route.ActionMapping
                                       .Single(p => String.Equals(p.Value, action, StringComparison.OrdinalIgnoreCase))
                                       .Key;
                }
            }
        }
Beispiel #2
0
        public static TVirtualPathData DoGetVirtualPath <TVirtualPathData>(this ICodeRoute route, IDictionary <string, object> values, IDictionary <string, object> requestRouteValues, IDictionary <string, object> requestRouteDataTokens, Func <TVirtualPathData> getVirtualPath) where TVirtualPathData : class
        {
            if (values == null)
            {
                return(getVirtualPath());
            }

            string controllerRef;
            string valuesRouteContext = GetRouteContext(values, requestRouteValues, requestRouteDataTokens, out controllerRef);

            if (valuesRouteContext == null)
            {
                return(null);
            }

            string thisRouteContext = (string)route.DataTokens[DataTokenKeys.RouteContext];

            if (!String.Equals(valuesRouteContext, thisRouteContext, StringComparison.OrdinalIgnoreCase))
            {
                if (controllerRef != null)
                {
                    values["controller"] = controllerRef;
                }

                return(null);
            }

            string unmappedController = null;
            string unmappedAction     = null;

            MapValue("controller", values, route.ControllerMapping, out unmappedController);
            bool actionWasMapped = MapValue("action", values, route.ActionMapping, out unmappedAction);

            TVirtualPathData virtualPath = getVirtualPath();

            // See issue #291
            // When the route matches don't change the controller back to its original value
            // because it's used by ASP.NET MVC on child requests (e.g. Html.Action())
            // to locate the controller (DefaultControllerFactory).

            if (virtualPath == null &&
                controllerRef != null)
            {
                values["controller"] = controllerRef;
            }

            if (actionWasMapped)
            {
                values["action"] = unmappedAction;
            }

            return(virtualPath);
        }