Is there any easy/builtin way to make URL in lowercase for MVC3.
I have code that could do it but looking something simple to implement.
routes.MapRouteLowercase( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "index", id = UrlParameter.Optional } // Parameter defaults ); 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) { VirtualPathData path = base.GetVirtualPath(requestContext, values); if (path != null) { path.VirtualPath = path.VirtualPath.ToLowerInvariant(); } 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, (object)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; } }
Stick to one version: The lowercase pattern is recommended (because there will always be people who will link to this more traditional version). Use 301 redirects: If you see URLs with capital letters get into index (someone linked to it or you changed your content management system and it capitalized some URLs).
An Internet address is only case sensitive for everything after the domain name. For example, it does not matter if you use uppercase or lowercase with "computerhope.com," it still reaches the same page. However, when typing the name of the page, file, or directory in the URL, it is case sensitive.
I've just noticed that there is a new property in .NET Framework 4.5. Works great! RouteCollection.LowercaseUrls
Set LowercaseUrls to true
public static void RegisterRoutes(RouteCollection routes) { routes.LowercaseUrls = true; ... }
Create a link
@Html.ActionLink("Log in", "Login", "Account")
That will create awesome, lowercase url :)
<a href="/account/login">Log in</a>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With