This is a migrated thread and some comments may be shown as answers.

LowercaseRouteHelper Patch for Grid

0 Answers 29 Views
Grid
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
Ron DeFreitas
Top achievements
Rank 2
Ron DeFreitas asked on 06 Mar 2012, 06:50 PM
Hi all,

I've been using some of the commonly found solutions on stackoverflow for setting up Lowercase Routes...  unfortunately, I found that these solutions broke some of the Grid functionality.

For anyone else who experiences this problem, here's a fixed version of the LowercaseRouteHelper and associated extensions that prevents lowercasing of query string parameters:

  public class LowercaseRoute : Route
    {
        public LowercaseRoute(string url, IRouteHandler routeHandler)
            : base(url, routeHandler)
        {
        }
 
        public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
            : base(url, defaults, routeHandler)
        {
        }
 
        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
                              IRouteHandler routeHandler)
            : base(url, defaults, constraints, routeHandler)
        {
        }
 
        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
                              RouteValueDictionary dataTokens, IRouteHandler routeHandler)
            : base(url, defaults, constraints, dataTokens, routeHandler)
        {
        }
 
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            var path = base.GetVirtualPath(requestContext, values);
 
            if (path != null && !string.IsNullOrWhiteSpace(path.VirtualPath))
            {
                var splitPath = path.VirtualPath.Split('?');
 
                var tmpPath = splitPath[0].ToLowerInvariant();
 
                tmpPath = splitPath.Where(part => !part.Equals(splitPath[0])).Aggregate(tmpPath,
                                                                                        (current, part) =>
                                                                                        current + ("?" + part));
 
                path.VirtualPath = tmpPath;
            }
 
            return path;
        }
    }
 
public static class RouteCollectionExtensions
    {
        public static Route MapRouteLowercase(this RouteCollection routes, string name, string url)
        {
            return routes.MapRouteLowercase(name, url, null /* defaults */, (object) null /* constraints */);
        }
 
        public static Route MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults)
        {
            return routes.MapRouteLowercase(name, url, defaults, (object) null /* constraints */);
        }
 
        public static Route MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults,
                                              object constraints)
        {
            return routes.MapRouteLowercase(name, url, defaults, constraints, null /* namespaces */);
        }
 
        public static Route MapRouteLowercase(this RouteCollection routes, string name, string url, string[] namespaces)
        {
            return routes.MapRouteLowercase(name, url, null /* defaults */, null /* constraints */, namespaces);
        }
 
        public static Route MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults,
                                              string[] namespaces)
        {
            return routes.MapRouteLowercase(name, url, defaults, null /* constraints */, namespaces);
        }
 
        public static Route MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults,
                                              object constraints, string[] namespaces)
        {
            if (routes == null)
            {
                throw new ArgumentNullException("routes");
            }
            if (url == null)
            {
                throw new ArgumentNullException("url");
            }
 
            Route route = new LowercaseRoute(url, new MvcRouteHandler())
                            {
                                Defaults = new RouteValueDictionary(defaults),
                                Constraints = new RouteValueDictionary(constraints),
                                DataTokens = new RouteValueDictionary()
                            };
 
            if ((namespaces != null) && (namespaces.Length > 0))
            {
                route.DataTokens["Namespaces"] = namespaces;
            }
 
            routes.Add(name, route);
 
            return route;
        }
 
        public static Route MapRouteLowercase(this AreaRegistrationContext context, string name, string url)
        {
            return context.MapRouteLowercase(name, url, (object) null /* defaults */);
        }
 
        public static Route MapRouteLowercase(this AreaRegistrationContext context, string name, string url, object defaults)
        {
            return context.MapRouteLowercase(name, url, defaults, (object) null /* constraints */);
        }
 
        public static Route MapRouteLowercase(this AreaRegistrationContext context, string name, string url, object defaults,
                                              object constraints)
        {
            return context.MapRouteLowercase(name, url, defaults, constraints, null /* namespaces */);
        }
 
        public static Route MapRouteLowercase(this AreaRegistrationContext context, string name, string url,
                                              string[] namespaces)
        {
            return context.MapRouteLowercase(name, url, null /* defaults */, namespaces);
        }
 
        public static Route MapRouteLowercase(this AreaRegistrationContext context, string name, string url, object defaults,
                                              string[] namespaces)
        {
            return context.MapRouteLowercase(name, url, defaults, null /* constraints */, namespaces);
        }
 
        public static Route MapRouteLowercase(this AreaRegistrationContext context, string name, string url, object defaults,
                                              object constraints, string[] namespaces)
        {
            if (namespaces == null && context.Namespaces != null)
            {
                namespaces = context.Namespaces.ToArray();
            }
 
            Route route = context.Routes.MapRouteLowercase(name, url, defaults, constraints, namespaces);
            route.DataTokens["area"] = context.AreaName;
 
            // disabling the namespace lookup fallback mechanism keeps this areas from accidentally picking up
            // controllers belonging to other areas
            bool useNamespaceFallback = (namespaces == null || namespaces.Length == 0);
            route.DataTokens["UseNamespaceFallback"] = useNamespaceFallback;
 
            return route;
        }
    }
Tags
Grid
Asked by
Ron DeFreitas
Top achievements
Rank 2
Share this question
or