2

我注意到一个 SO 答案建议IgnoreRoute 的或分隔匹配,如下所示:

routes.IgnoreRoute("*.js|css|swf");

当我尝试时,它失败了。我不得不将建议的一行代码转换为多行,如下所示:

routes.IgnoreRoute("Javascript/{*catchall}");
routes.IgnoreRoute("Content/{*catchall}");
routes.IgnoreRoute("Scripts/{*catchall}");

实际上有没有更简洁的方式来表达文件的豁免(例如css、javascript等)?另外,我想知道原始链接是否真的是错误的,或者我只是错过了一些东西。

是的,请假设我想要并且需要routes.RouteExistingFiles = true

4

2 回答 2

2

我想出了一个更简单的方法:

routes.RouteExistingFiles = true;
routes.IgnoreRoute("{*relpath}", new { relpath = @"(.*)?\.(css|js|htm|html)" });

也无需担心尾随的 http 查询字符串,因为 System.Web.Routing.Route 类在评估期间已经剥离了该部分。

有趣的是,Route.GetRouteData(...) 中的代码将采用提供的正则表达式约束,并添加“开始”和“结束”行要求,如下所示:

string str = myRegexStatementFromAbove;
string str2 = string.Concat("^(", str, ")$");

这就是为什么我写的正则表达式如果仅仅写成这样就不起作用的原因:

routes.IgnoreRoute("{*relpath}", new { relpath = @"\.(css|js|htm|html)" });
于 2012-06-27T23:21:31.430 回答
1

我不确定您是否可以在一行中指定所有这些。另一种方法是您可以创建自定义路由约束并完全忽略这些文件夹/文件

更新:

根据@Brent的反馈,检查pathinfo比比较folder.

public class IgnoreConstraint : IRouteConstraint
{
    private readonly string[] _ignoreList;

    public IgnoreConstraint(params string[] ignoreList)
    {
        _ignoreList = ignoreList;
    }

    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, 
    RouteValueDictionary values, RouteDirection routeDirection)
    {
        return _ignoreList.Contains(Path.GetExtension(values["pathinfo"].ToString()));
    }
}

全球.asax.cs

routes.IgnoreRoute("{*pathInfo}", new { c = 
           new IgnoreConstraint(".js", ".css") });

routes.RouteExistingFiles = true;

==================================================== ===============================

以前的代码

  public class IgnoreConstraint: IRouteConstraint
  {
    private readonly string[] _ignoreArray;

    public IgnoreConstraint(params string[] ignoreArray)
    {
      _ignoreArray = ignoreArray;
    }

    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, 
      RouteValueDictionary values, RouteDirection routeDirection)
    {
      var folder = values["folder"].ToString().ToLower();

      return _ignoreArray.Contains(folder);
    }
  }

在 Global.asax.cs

routes.IgnoreRoute("{folder}/{*pathInfo}", new { c = 
          new IgnoreConstraint("content", "script") });

routes.RouteExistingFiles = true;
于 2012-06-26T04:08:40.737 回答