2

次のように、IgnoreRouteの一致または区切り文字を示唆するSOの回答に気づきました。

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

私がそれを試してみたとき、それは失敗しました。提案された1行のコードを次のように複数行に変換する必要がありました。

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

System.Web.Routing.Route クラスでは、評価中にその部分が既に取り除かれているため、末尾の http クエリ文字列についても心配する必要はありません。

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

それらすべてを 1 行で指定できるかどうかはわかりません。もう 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()));
    }
}

Global.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 に答える