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;
}
}