1

そのため、理論的には非常に単純なはずの回避策を数時間試みてきました。次のサンプル 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」ルート値がこのリダイレクトに含まれないようにするにはどうすればよいですか?

ルート値を取り除くために、次のことを試しました。

  1. 独自のRouteValueDictionary匿名ルート データ オブジェクトを作成し、それを のオーバーロードに渡しますRedirectToRoute
  2. 独自のアクション結果を作成して、RouteTable.Routes自分でルートを調べて見つけ、自分でトークンを置き換えます。これは最も「ぎこちない」ようで、車輪の再発明のようです。
  3. RedirectWithoutキー値と呼び出しを受け取るようなメソッドを作成しますRedirectToRouteResult.RouteValues.Remove(key)-これも機能しませんでした。
  4. また、追加したくないキーに null 値を追加しようとしました。ただし、これによりルートが正しくないものに変更されます。つまり、正しい URL ではないnew { controller = "Products", action = "List", state = stateName, city = (string)null }リダイレクトが発行されます。/Products/List?state=Texas

これはすべて、RedirectToRoute が現在のリクエスト コンテキストを取得して仮想パス データを構築することに起因しているようです。回避策はありますか?

4

1 に答える 1

1

T4MVC を使用していた場合は、次のようなことができるはずです。

return RedirectToAction(MVC.Products.List(state, null));

これを試しましたか?

return RedirectToRoute(new 
{
    controller = "Products", 
    action = "List", 
    state = state,
    city = null, 
});

コメントへの返信

オプションのパラメーターが最後にないため、MVC が混乱している可能性があります。RedirectToRoute以下は、指定された上記で動作するはずcity = nullです:

routes.MapRoute(
    "products",
    "products/in/{state}/{city}",
    new
    {
        controller = "Products",
        action = "List",
        // state = UrlParameter.Optional, // only let the last parameter be optional
        city = UrlParameter.Optional 
    });

次に、別のルートを追加して、stateオプションの URL を処理できます。

routes.MapRoute(null, // I never name my routes
    "products/in/{state}",
    new
    {
        controller = "Products",
        action = "List",
        state = UrlParameter.Optional 
    });
于 2012-08-01T20:11:24.420 に答える