与GetVirtualPath路由匹配

时间:2010-10-21 13:16:27

标签: asp.net-mvc asp.net-mvc-2 routing paging

我的应用程序中有以下路由...

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute(
    "Branding",
    "foo/bar.css",
    new { controller = "DynamicContent", action = "CSS" }
  );

  routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Account", action = "Index", id = UrlParameter.Optional }
  );
}

我正在使用Martijn Boland's paging mechanism,最终会进行以下调用:

var virtualPathData = 
  RouteTable.Routes.GetVirtualPath(this.viewContext.RequestContext, pageLinkValueDictionary);

我已经验证我的RequestContext中的控制器和操作是有效的。但是一旦进行了这个调用,virtualPathData引用了foo / bar.css的URL。我已经验证了URL映射到正确的控制器/操作。如果我注释掉上面的路由而保留默认值,则virtualPathData的URL对应于正确的控制器/操作。

我也尝试过以下一行,结果相同。

//var virtualPathData = 
  RouteTable.Routes.GetVirtualPathForArea(this.viewContext.RequestContext, pageLinkValueDictionary);

任何人都可以帮我弄清楚我做错了吗?

2 个答案:

答案 0 :(得分:2)

不幸的是,我认为生成URL的逻辑不能很好地处理静态URL。我相信你能做的一件事是:

routes.MapRoute(     “品牌”,     “{}控制器/bar.css”,     new {controller =“DynamicContent”,action =“CSS”},     新{controller =“foo”}   );

尝试一下。

答案 1 :(得分:1)

我仍然不确定为什么我会看到上述行为,所以如果有人想要让他们的想法充满信心,那就感到自由。

也就是说,如果其他人遇到同样的问题,我可以通过颠倒路由顺序来克服它,首先使用NotEqual约束添加更加模糊的默认路由,以确保根据需要命中DynamicContent路由。 / p>

routes.MapRoute(
  "Default",
  "{controller}/{action}/{id}",
  new { controller = "Account", action = "Index", id = UrlParameter.Optional },
  new { controller = new NotEqual("DynamicContent") }
);

routes.MapRoute(
  "Branding",
  "foo/bar.css",
  new { controller = "DynamicContent", action = "CSS" }
);

对于那些想知道NotEqual是什么的人,我发现它on a blog

public class NotEqual : IRouteConstraint
{
  private string _match = string.Empty;

  public NotEqual(string match)
  {
    _match = match;
  }

  public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
  {
    return String.Compare(values[parameterName].ToString(), _match, true) != 0; 
  }
}

我肯定会听到更好的方法,或者为什么我的原始代码没有完全正常工作。