This question is locked. New answers and comments are not allowed.
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:
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; } }