2012-09-07 6 views
6

私はいくつかのルートを持つMVC3アプリケーションを持っています。彼ら二人は次のように定義されています。Url.Actionは期待される結果を与えません。不要なルート値が残ります

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/と表示され、それが期待値です。私は、Webページの例/System/MySystemのために参照するとき

はしかし、私はまだリンクが同じ場所を指すようにしたいだろうが、今、彼らは/System/MySystem/Carrier/MySystemを指します。

私は、ルート値から名前を使用することからリンクを維持するために多くのことを試みましたが、役に立たなかった。ルートの値から名前値がないことを確実にするためにここに何か良い方法はあります

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

今リンクが

/System?name=MySystem 

として現れた:私はこれをしようとしたとき、私は経験した奇妙なケースでしたどのようにしてこれらのリンクに干渉しますか?

答えて

6

あなたが気づいたように、Url.ヘルパは以前に与えられたルートパラメータを再利用します。あなたのビューでUrl.Actionを呼び出す前に、そう

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

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

削除RequestContextからプレフィルドname:それは

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

ALS Oの回避策がありますが、少しご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 } 
); 

あなたの元の溶液(「ヌル」Url.Actionname)も動作します:

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

私はもっとエレガントなものも望んでいましたが、少なくともこれは仕事を完了させます。ありがとう。 –

関連する問題