質問
ルーティングでは、ルートハンドラが見つからないようなものが欲しいです。
たとえば、次のようなマッピングを1つ作成しました
routes.MapRoute(
"default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id="" }
);
routes.MapRoute(
"Catchall",
"{*catchall}",
new { controller = "Home", action = "Lost" }
);
ただし、ユーザーが/ one / two / three / four / bla / blaなどのアドレスを挿入すると、キャッチオールマッピングでキャッシュされます。
ただし、ユーザーがデフォルトのマッピングと一致するものを挿入すると、 (/ one / two /のようですが、このコントローラーまたはアクションは実装されていません) Catchallマッピングがこのリクエストを受け入れるようにしたいのですが、 他のすべてのマッピングが失敗したためです。しかし、これの代わりにエラーが発生します。
コントローラまたはアクションが例外を取得した場合、いくつかのマッピングハンドラをオーバーライドして例外をキャッチする必要がありますか?
解決
ここでの問題は、「ワンツー」を確認するのはルートの責任ではないということです。 ファイルにマッピングします。その責任はViewEngineにあります。 「1/2」から有効なルートである場合、選択されます。
無効なルートのエラーを処理する場合、組み込みのErrorHandling" page"を使用することをお勧めします。 Catchallで行ったメッセージを表示します。
他のヒント
これは最善の解決策ではないと思いますが、ルートをより具体的にすることができます:
routes.MapRoute(
"home and action",
"home/index/{id}",
new { controller = "Home", action = "Index", id="" }
);
...残りのアクションについて繰り返します...
routes.MapRoute(
"article catch all",
"home/{article}",
new { controller = "Home", action = "ArticleSearcher", article="" }
);
これは直接のアクションとのマッチングを試み、アクションが見つからない場合、通常はデフォルトルートの{action}部分となるものを記事文字列パラメーターとして「ArticleSearcher」アクションに渡します。
欠点は、各コントローラー/アクションルートを明示的に作成する必要があることです。