2

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

たとえば、次のようなマッピングを作成しました

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 のようなアドレスを挿入すると、Catchall マッピングでキャッシュされます。

しかし、ユーザーがデフォルトのマッピングと一致する必要があるものを挿入すると ( /one/two/ のように、このコントローラーまたはアクションは実装されていません)、他のすべてのマッピングが失敗したため、Catchall マッピングがこの要求を受け入れるようにする必要があります。しかし、これの代わりにエラーが発生します。

コントローラーまたはアクションが例外を取得した場合、いくつかのマッピング ハンドラーをオーバーライドして例外をキャッチする必要がありますか?

4

2 に答える 2

0

ここでの問題は、「1/2」がファイルにマップされていることを確認するのは Route の責任ではないということです。その責任は ViewEngine にあります。「one/two」は有効なルートであるため、選択されます。

無効なルートのエラーを処理したい場合は、組み込みの ErrorHandling "ページ" を使用して、Catchall で行ったメッセージを表示することをお勧めします。

于 2008-11-25T11:13:06.450 に答える
0

これが最善の解決策だとは思いませんが、いつでもルートをより具体的にすることができます。

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」アクションに渡します。

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

于 2008-11-25T12:28:05.550 に答える