そのため、理論的には非常に単純なはずの回避策を数時間試みてきました。次のサンプル URL を見てみましょう。
http://sample.com/products/in/texas/dallas
これは特定のルートにマップされます。
routes.MapRoute(
"products",
"products/in/{state}/{city}",
new { controller = "Products", action = "List", state = UrlParameter.Optional, city = UrlParameter.Optional });
私のアクション メソッドでは、"texas" と "dallas" が存在し、その "dallas" がテキサス内に存在することを確認するためにルックアップを実行できます。それはすべて元気でダンディです。ただし、都市が存在しない状況では (地理が正しくないか、スペルが間違っているため)、州レベルをバックアップしたいと考えています。例:
http://sample.com/products/in/texas/dallax
それはリダイレクトを発行する必要があります
http://sample.com/products/in/texas
これを行う「簡単な」方法は、次のように Redirect 呼び出しを発行することでした。
return Redirect("/products/in/" + stateName);
ただし、これを URL 構造から分離しようとしています。たとえば、ルートの外観を変更する (たとえば、パターンを に変更するproducts/around/{state}/{city}
) ことにした場合、このコントローラーを更新して URL リダイレクトを修正する必要があることを知っておく必要があります。
ルート値を調べるだけで解決できるソリューションを作成できれば、ルート パターンを変更しても心配する必要はありません。
理想的には、次のようなことをしたいと思っていました。
return RedirectToRoute(new { controller = "Products", action = "List", state = state });
(これは単純化された例であることに注意してください。コントローラー名やアクション メソッド名などの「必要な」ルート部分は、それぞれジェネリック引数と式インスペクションによって決定されます)。
それは実際にリダイレクトを実行しますが、現在のリクエストからのルート値がリダイレクトに追加されるため、リダイレクトループに入ります(ルートオブジェクトに都市ルート値を含めていないことに注意してください)。「city」ルート値がこのリダイレクトに含まれないようにするにはどうすればよいですか?
ルート値を取り除くために、次のことを試しました。
- 独自の
RouteValueDictionary
匿名ルート データ オブジェクトを作成し、それを のオーバーロードに渡しますRedirectToRoute
。 - 独自のアクション結果を作成して、
RouteTable.Routes
自分でルートを調べて見つけ、自分でトークンを置き換えます。これは最も「ぎこちない」ようで、車輪の再発明のようです。 RedirectWithout
キー値と呼び出しを受け取るようなメソッドを作成しますRedirectToRouteResult.RouteValues.Remove(key)
-これも機能しませんでした。- また、追加したくないキーに null 値を追加しようとしました。ただし、これによりルートが正しくないものに変更されます。つまり、正しい URL ではない
new { controller = "Products", action = "List", state = stateName, city = (string)null }
リダイレクトが発行されます。/Products/List?state=Texas
これはすべて、RedirectToRoute が現在のリクエスト コンテキストを取得して仮想パス データを構築することに起因しているようです。回避策はありますか?