Asp.Net ルーティング:複数のワイルドカード ルートを無視するにはどうすればよいですか?
-
09-06-2019 - |
質問
複数のワイルドカード ルートを無視したいと考えています。asp.net mvc プレビュー 4 には、以下が同梱されています。
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
また、次のようなものを追加したいと思います。
RouteTable.Routes.IgnoreRoute("Content/{*pathInfo}");
しかし、それは私のプログラムでURLを生成するヘルパーの一部を壊すようです。考えは?
解決
ここで考えられる解決策は 2 つあります。
無視するルートに制約を追加して、無視する必要があるリクエストのみがそのルートに一致するようにします。ちょっとぎこちないですが、うまくいくはずです。
RouteTable.Routes.IgnoreRoute("{folder}/{*pathInfo}", new {folder="content"});
コンテンツ ディレクトリには何が入っていますか?デフォルトでは、ルーティングはディスク上に存在するファイルをルーティングしません (実際には VirtualPathProvider をチェックします)。したがって、静的コンテンツを Content ディレクトリに配置している場合は、ignore ルートは必要ない可能性があります。
他のヒント
これは非常に難しい場合があります。
ルート データをルートにマッピングする方法を見つけ出そうとする場合、システムは現在、必要な情報がすべて提供されているものが見つかるまでトップダウンで検索し、その後、その他すべてをクエリ パラメータに詰め込みます。
ルート「Content/{*pathInfo}」の必要な情報は常に完全に満たされており (このルートには必要なデータがまったくありません)、ルート リストの先頭近くにあるため、名前のないルートにマップしようとしても、このパターンに一致すると、すべての URL はこれに基づきます ("Content?action=foo&controller=bar")
残念ながら、アクション ルートではこれを回避する方法はありません。名前付きルートを使用する場合 (つまり、Html.ActionLink の代わりに Html.RouteLink を選択する場合)、一致するルートの名前を指定できます。利便性は劣りますが、より正確です。
IMO によれば、複雑なルートはアクション ルーティング システムを基本的に破綻させます。デフォルト ルート以外のものを使用するアプリケーションでは、常に正しいルートを取得できるようにするために、ほとんどの場合、名前付きルート ベースの URL 生成に戻ってしまいます。