与GetVirtualPath匹配的路由

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与GetVirtualPath匹配的路由相关的知识,希望对你有一定的参考价值。

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

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);

有人可以帮我弄清楚我在做什么错吗?

答案

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

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

尝试一下。

另一答案

我仍然不确定我为什么会看到上面的行为,因此,如果有人想随心所欲地发表自己的想法,请随意发表。

也就是说,如果其他人遇到了相同的问题,我可以通过颠倒路线顺序来解决此问题,首先添加更具歧义性的默认路线,并添加一个NotEqual约束,以确保根据需要点击DynamicContent路线。

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" }
);

对于那些想知道不相等的人,我找到了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; 
  }
}

我当然愿意听到更好的方法,或者为什么我的原始代码不能完全正常工作。

以上是关于与GetVirtualPath匹配的路由的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

route和router 当前与全局路由

vue知识点-$route和$router

路由器路由器 dom v 6 中没有与位置“/cart”匹配的路由