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;
}
}
See Question&Answers more detail:os