2012-02-23 21 views
1

URLがルートに一致するが、そのルートへのパラメータが間違っていることを検出するルートを作成するにはどうすればよいですか?スペルの間違ったURLのASP.NET MVCルート処理?

私は、ユーザーがURLを入力ミスしており、ルートテーブルは非常に優雅にこれらのスペルミスを処理しないので、デバッグが困難であった、最近いくつかの例持っていた:このルートは/ URL /ウィジェットを扱う

routes.MapRestfulRoute(
    "WidgetsItem", 
    "Widgets/{idString}", 
    new { controller = "Widgets", action = "Item" }, 
    new { idString = 
    @"^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$"} 
); 

routes.MapRoute("WidgetsList", "Widgets", new { controller = "Widgets", action = "List" }); 
routes.MapRestfulRoute("CatchAll","{*url}", new {controller = "Error", action = "Http404"}); 

をGUIDとユーザーが正しい見えますが(ただし、GUIDで唯一の28文字があります)されていない25246810-4b60-4db8-8567-8db8826/URL /ウィジェットに入りました。

URLがルートと一致しなかったため、応答は404でした。しかし、これは誤解を招き、デバッグの問題を引き起こしました。ウィジェット/アイテムアクションが404を返すように見えます。実際にはアクションが呼び出されていないときに、そのアクションには間違っていました。私がRouteDebuggerをインストールするまでは、guidの形式が間違っていたことに気づいた。

URLが実際にルートと一致するが、そのルートへのパラメータが間違っていることを検出する別のエラールートを作成するにはどうすればよいですか?

EDIT:I /ウィジェット/何も一致する新しいルートを追加すると、通常のルートの後にそのルートを置くことによって、それを「修正」することができます

routes.MapRestfulRoute(
    "WidgetsItemError", 
    "Widgets/{idString}", 
    new { controller = "Widgets", action = "Item" }, 
    new { idString = @"^.+$" } // match if it has any param at all 
); 

しかし、これは非常に非効率的であると思われる - 私は意志/ Foo、/ Bar/FooBarなどのすべての単一のルートに対して同様のエラールートを追加する必要があります(ルートがかなりあります)。これを行うためのより一般的な方法はありませんか?

+0

ルートの制約により、アプリケーションのパフォーマンスが低下することがあります。 – Paul

+0

これをサポートするためのディスカッションへのリンクはありますか?/Widgets/guid(1つのアイテムを返す)と/ Widgets(リストを返す)を区別できる方法はありますか? –

+0

なぜユーザーは手動でGUIDを入力していますか?それは非常にエラーが発生しやすいです。 – RickAndMSFT

答えて

0

最も簡単な解決策は、ルート制約を削除し、コントローラ内のnullパラメータをチェックし、そのポイントから必要なものを実行することです。

+1

または、制約の他のすべてを含む別のルートを直ちに追加し、異なる行動。そうすれば、ロジックを別々に保つことができます。 – bhamlin

+0

@bhamlin - 良い点。後の2番目のルートは、最初のパスが失敗した場合にのみキャッチします。 –

+0

上記のようなパラメータを持たない2番目のルートがすでにあります:ウィジェット/ guidはアイテムをロードしますが、/ウィジェット(パラメータなし)はリストをロードします –

2

私のルートでguidを扱うとき、私は文字列を受け入れ、文字列値をguidに解析しようとします。解析しなければ、idを示すメッセージで別のビューを返します無効だったと改めて

あなたは(あなたのアクションがすでに文字列を受け付けていない限り)の代わりに、GUIDの文字列を受け入れるようにルート制約を削除し、あなたの行動を変えることであろう、ここで変更する必要があります唯一の事

しようとします
+1

ええ、それは実際にはアクションの文字列パラメタであり、すでに文字列が有効なGUIDであることを確認するチェックがありました。しかし、ルートのために、それは決してアクションにそれを作ったことはありません。私は、文字列を受け入れるようにルートを変更しましたが、それ以上の問題はありませんでした。 –

+0

私は助けてうれしいです。それがあなたの問題を解決するのに役立ちましたら、これを受け入れられた回答としてマークしてください。ありがとう –

関連する問題