1.要想使用Route特性自定义Action名称,需要注册Mvc路由特性。
在RouteConfig的RegisterRoutes方法里,调用:routes.MapMvcAttributeRoutes();
这里需要注意的是,如果Controller继承了一个父Controller,且父类Controller中,有泛型方法,就会报错:“您不能调用控制器xxx上的xx方法,因为该方法是一种泛型方法。”
如在父类Controller中定义了:pulbic JsonResult Success(string msg)。
这里需要吧pulbic访问修饰符改成protected就好,
2.路由全改为小写,需要重写路由匹配规则,代码如下:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapLowerCaseUrlRoute("Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
//routes.MapRoute(
// name: "Default",
// url: "{controller}/{action}/{id}",
// defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
//);
}
}
public class LowerCaseUrlRoute : Route
{
private static readonly string[] requiredKeys = new[] { "area", "controller", "action" };
public LowerCaseUrlRoute(string url, IRouteHandler routeHandler)
: base(url, routeHandler) { }
public LowerCaseUrlRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
: base(url, defaults, routeHandler) { }
public LowerCaseUrlRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
: base(url, defaults, constraints, routeHandler) { }
public LowerCaseUrlRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler)
: base(url, defaults, constraints, dataTokens, routeHandler) { }
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
LowerRouteValues(requestContext.RouteData.Values);
LowerRouteValues(values);
LowerRouteValues(Defaults);
return base.GetVirtualPath(requestContext, values);
}
private void LowerRouteValues(RouteValueDictionary values)
{
foreach (var key in requiredKeys)
{
if (values.ContainsKey(key) == false) continue;
var value = values[key];
if (value == null) continue;
var valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
if (valueString == null) continue;
values[key] = valueString.ToLower();
}
var otherKyes = values.Keys
.Except(requiredKeys, StringComparer.InvariantCultureIgnoreCase)
.ToArray();
foreach (var key in otherKyes)
{
var value = values[key];
values.Remove(key);
values.Add(key.ToLower(), value);
}
}
}
}
public static class LowerCaseUrlRouteMapHelper
{
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this RouteCollection routes, string name, string url)
{
return routes.MapLowerCaseUrlRoute(name, url, null, null);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this RouteCollection routes, string name, string url, object defaults)
{
return routes.MapLowerCaseUrlRoute(name, url, defaults, null);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this RouteCollection routes, string name, string url, string[] namespaces)
{
return routes.MapLowerCaseUrlRoute(name, url, null, null, namespaces);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this RouteCollection routes, string name, string url, object defaults, object constraints)
{
return routes.MapLowerCaseUrlRoute(name, url, defaults, constraints, null);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces)
{
return routes.MapLowerCaseUrlRoute(name, url, defaults, null, namespaces);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(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");
LowerCaseUrlRoute route2 = new LowerCaseUrlRoute(url, new MvcRouteHandler());
route2.Defaults = new RouteValueDictionary(defaults);
route2.Constraints = new RouteValueDictionary(constraints);
route2.DataTokens = new RouteValueDictionary();
LowerCaseUrlRoute item = route2;
if ((namespaces != null) && (namespaces.Length > 0))
item.DataTokens["Namespaces"] = namespaces;
routes.Add(name, item);
return item;
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this AreaRegistrationContext context, string name, string url)
{
return context.MapLowerCaseUrlRoute(name, url, null);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this AreaRegistrationContext context, string name, string url, object defaults)
{
return context.MapLowerCaseUrlRoute(name, url, defaults, null);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this AreaRegistrationContext context, string name, string url, string[] namespaces)
{
return context.MapLowerCaseUrlRoute(name, url, null, namespaces);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this AreaRegistrationContext context, string name, string url, object defaults, object constraints)
{
return context.MapLowerCaseUrlRoute(name, url, defaults, constraints, null);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this AreaRegistrationContext context, string name, string url, object defaults, string[] namespaces)
{
return context.MapLowerCaseUrlRoute(name, url, defaults, null, namespaces);
}
public static LowerCaseUrlRoute MapLowerCaseUrlRoute(this AreaRegistrationContext context, string name, string url, object defaults, object constraints, string[] namespaces)
{
if ((namespaces == null) && (context.Namespaces != null))
namespaces = context.Namespaces.ToArray<string>();
LowerCaseUrlRoute route = context.Routes.MapLowerCaseUrlRoute(name, url, defaults, constraints, namespaces);
route.DataTokens["area"] = context.AreaName;
bool flag = (namespaces == null) || (namespaces.Length == 0);
route.DataTokens["UseNamespaceFallback"] = flag;
return route;
}