代码之家  ›  专栏  ›  技术社区  ›  Mayo

与GetVirtualPath匹配的路由

  •  1
  • Mayo  · 技术社区  · 14 年前

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

    我也试过下面这句话,结果是一样的。

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

    有谁能帮我弄清楚我做错了什么吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   emrea    4 年前

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

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

    试试看。

        2
  •  1
  •   Mayo    14 年前

    也就是说,如果其他人遇到了相同的问题,我可以通过反转路由顺序来克服它,首先使用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" }
    );
    

    对于那些想知道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; 
      }
    }