我创建了一个名为CustomRoute
的自定义路由,它在GetVirtualPath
方法上执行各种操作(对于此示例,我将整个URL设置为小写),具有以下结构:
public sealed class CustomRoute : Route
{
public CustomRoute(string url, IRouteHandler routeHandler) : base(url, routeHandler) { }
public CustomRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler) { }
public CustomRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler) : base(url, defaults, constraints, routeHandler) { }
public CustomRoute(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;
}
}
我通过名为MapCustomRoute
的扩展方法将此路由添加到我的路径集合中:
public static CustomRoute MapCustomRoute(this RouteCollection routes, string url, object defaults)
{
CustomRoute route = new CustomRoute(url, new RouteValueDictionary(defaults), new MvcRouteHandler());
routes.Add(route);
return route;
}
然后最终在global.asax:{/ p>中的RouteTable.Routes
集合上调用此扩展
RouteTable.Routes.Clear();
RouteTable.Routes.MapCustomRoute("somecontroller/someaction/{id}", new { controller = "Home", action = "Index" });
路由工作正常,我的请求被正确映射到相应的控制器和操作 - 但是URL仍然是大写的。单步执行我的代码,我可以看到在初始化路由时正在调用CustomRoute
的构造函数 - 但在发出请求时从不调用GetVirtualPath
方法。我在这里遗漏了一些明显的东西,我试图使用路线调试工具,一切看起来都不错,所以我在这里不知所措!
答案 0 :(得分:2)
通过我的问题列表关闭打开的问题,我找到了这个。这个是一个奇怪的;为了解决这个问题,我必须从头开始重新创建我的Visual Studio解决方案。然后,通过使用我上面的确切代码,新项目正常工作 - 但旧项目没有。我认为这是VS 2010的奇怪主义,我同时运行两个解决方案,确认他们有完全相同的代码库,一个工作,另一个没有。