質問

ルーティングでは、ルートハンドラが見つからないようなものが欲しいです。

たとえば、次のようなマッピングを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」アクションに渡します。

欠点は、各コントローラー/アクションルートを明示的に作成する必要があることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top