O Asp.Net Mvc trás muitas facilidades para a programação web, dentre elas esta as Urls amigáveis.
Porém por padrão o Mvc Gera as Urls com letras maiúsculas (na verdade ele gera conforme o nome da Action que por convenção C# Pascal Case terá letra mainúscula).
Uma boa prática que se tornou padrão na internet é utilizarmos urls com letras minúsculas e separar as palavras por hifen, deixando mais legivel ao usuario final e dando uma ajudinha aos mecanismos de busca.
no arquivo Global.asax encontramos o seguinte metodo
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
o que precisamos fazer é criar um método de extenção que sobreescreva o routCollection padrão;
public static class RouteCollectionExtensions
{
public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults)
{
routes.MapRouteLowercase(name, url, defaults, null);
}
public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults, object constraints)
{
if (routes == null)
throw new ArgumentNullException("routes");
if (url == null)
throw new ArgumentNullException("url");
var route = new LowercaseRoute(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints)
};
if (String.IsNullOrEmpty(name))
routes.Add(route);
else
routes.Add(name, route);
}
}como podem ver este metodo de extensão acaba retornando um objeto Rote que eu nomeie de LowercaseRoute, então e hora de criar esta classe
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 RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData rd = base.GetRouteData(httpContext);
if (null != rd)
{
rd.Values.Decode();
}
return rd;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
values.Encode();
return base.GetVirtualPath(requestContext, values);
}
}
public static class UrlConverter
{
public static RouteValueDictionary Encode(this RouteValueDictionary aRoute)
{
return aRoute.ConvertToLowerWithHypen();
}
public static RouteValueDictionary Decode(this RouteValueDictionary aRoute)
{
return aRoute.ConvertToUpperHypenLess();
}
private static RouteValueDictionary ConvertToLowerWithHypen(this RouteValueDictionary aRoute)
{
var keys = (from kvp in aRoute where kvp.Key == "controller" || kvp.Key == "action" select kvp.Key).ToList();
foreach (string key in keys)
{
string value = ((string)aRoute[key]).Trim();
value = value.ToLowerWithHypen();
aRoute[key] = value;
}
return aRoute;
}
private static RouteValueDictionary ConvertToUpperHypenLess(this RouteValueDictionary aRoute)
{
var keys = (from kvp in aRoute where kvp.Key == "controller" || kvp.Key == "action" select kvp.Key).ToList();
foreach (var key in keys)
{
var value = ((string)aRoute[key]).Trim();
value = value.ToUpperHypenLess();
aRoute[key] = value;
}
return aRoute;
}
}[/code]
public static class ConvertString
{
public static string ToLowerWithHypen(this string value)
{
var result = new StringBuilder();
if (value.Length > 0)
{
result.Append(value[0]);
for (int i = 1; i 0)
{
result.Append(value[0].ToString().ToUpper());
for (int i = 1; i < value.Length; i++)
{
if (value[i] == '-')
{
i++;
result.Append(value[i].ToString().ToUpperInvariant());
}
else
{
result.Append(value[i]);
}
}
}
return result.ToString();
}
}[/code]


