Если вы просто ищете поддержку строчных маршрутов (в основном делая ваши маршруты без учета регистра), вы можете проверить ниже.В настоящее время мы используем это, и оно отлично работает.
Во-первых, вам понадобится файл RouteExtensions.cs или имя, которое вам нравится, со следующим (совместимо с ASP.NET MVC RC1):
using System;
using System.Web.Mvc;
using System.Web.Routing;
namespace MyMvcApplication.App.Helpers
{
public class LowercaseRoute : System.Web.Routing.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 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);
}
}
}
Затем используйте ссылку в вашем файле Global.asax.cs на вышеуказанный класс, и все готово для создания строчного маршрута.Ниже приведен пример строчного маршрута, и в любое время этот маршрут будет называться вашим URL в нижнем регистре.
routes.MapRouteLowercase(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "index", id = ""} // Parameter defaults
);
и, при необходимости, если вы заинтересованы в преобразовании любого входящего URL-адреса в нижний регистр (вводимый пользователем вручнуюили вызываемые ссылки) вы можете использовать это в своем методе Application_BeginRequest () (помните, что это не нужно для самих строчных маршрутов, код выше будет обрабатывать это):
protected void Application_BeginRequest(Object sender, EventArgs e)
{
// If upper case letters are found in the URL, redirect to lower case URL.
// Was receiving undesirable results here as my QueryString was also being converted to lowercase.
// You may want this, but I did not.
//if (Regex.IsMatch(HttpContext.Current.Request.Url.ToString(), @"[A-Z]") == true)
//{
// string LowercaseURL = HttpContext.Current.Request.Url.ToString().ToLower();
// Response.Clear();
// Response.Status = "301 Moved Permanently";
// Response.AddHeader("Location", LowercaseURL);
// Response.End();
//}
// If upper case letters are found in the URL, redirect to lower case URL (keep querystring the same).
string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
{
lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", lowercaseURL);
Response.End();
}
}
Ответ изначально пришел от this SO post.
Содержимое этого ответа взято из сообщения в блоге, которое больше недоступно, но его можно просмотреть на archive.org здесь .