6

いくつかのルートを持つMVC3アプリがあります。それらのうちの2つは次のように定義されます。

routes.MapRoute(
  null,
  "System/{name}", // URL with parameters
  new { controller = "Systems", action = "Index" } // Parameter defaults
);
routes.MapRoute(
  null,
  "Carrier/{name}", // URL with parameters
  new { controller = "Carriers", action = "Index" } // Parameter defaults
);

今、私のメニューには、Url.Actionを使用して作成されたこれらのルートへの2つのリンクがあります。

Url.Action("Index","Systems")
Url.Action("Index","Carriers")

これで、アプリケーションを起動すると、すべてが正常に表示され、メニューのリンクがととして表示/System//Carrier/れます。これが期待値です。

ただし、たとえば/System/MySystemWebページで参照する場合でも、リンクが同じ場所を指している必要がありますが、現在はとを指しているようになってい/System/MySystemます/Carrier/MySystem

リンクがルート値の名前を使用しないようにするために多くのことを試みましたが、役に立ちませんでした。私が経験した最も奇妙なケースは、私がこれを試したときでした:

Url.Action("Index","Systems", new{name = (string)null})

リンクは次のように表示されます

/System?name=MySystem

ルート値の名前の値がこれらのリンクに干渉しないようにするための良い方法はありますか?

4

1 に答える 1

6

お気づきのように、Url.ヘルパーは以前に指定されたルートパラメーターを再利用します。

回避策として(よりエレガントな解決策があることを願っています...)、ビューnameのからエントリを削除できます。RouteData.Values

だからUrl.Actionあなたの見解であなたを呼ぶ前に:

Url.Action("Index","Systems")
Url.Action("Index","Carriers")

name:からプレフィルを削除しRequestContextます

@{
     Request.RequestContext.RouteData.Values.Remove("name");
}

nameこれも回避策ですが、セグメントにデフォルトのnull値を指定してルートを少し変更すると、次のようになります。

routes.MapRoute(
  null,
  "System/{name}", // URL with parameters
  new { controller = "Systems", action = "Index", name = (string)null }
);
routes.MapRoute(
  null,
  "Carrier/{name}", // URL with parameters
  new { controller = "Carriers", action = "Index", name = (string)null }
);

元の解決策(の「null」)も機能nameします:Url.Action

@Url.Action("Index", "Systems" , new {name = (string)null} )
于 2012-09-07T15:20:21.627 に答える