在自定义路由上未调用GetVirtualPath

时间:2012-12-06 09:55:23

标签: c# asp.net-mvc asp.net-mvc-routing

我创建了一个名为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方法。我在这里遗漏了一些明显的东西,我试图使用路线调试工具,一切看起来都不错,所以我在这里不知所措!

1 个答案:

答案 0 :(得分:2)

通过我的问题列表关闭打开的问题,我找到了这个。这个是一个奇怪的;为了解决这个问题,我必须从头开始重新创建我的Visual Studio解决方案。然后,通过使用我上面的确切代码,新项目正常工作 - 但旧项目没有。我认为这是VS 2010的奇怪主义,我同时运行两个解决方案,确认他们有完全相同的代码库,一个工作,另一个没有。