2009-04-09 369 views
50

複数のパラメータを使用するルートがある場合、Html.ActionLinkに問題があります。最初の二つのルートが問題なく動作しますが、私が使用して第3の経路にアクションリンクを作成しようとすると複数のルート値を使用したASP.NET MVC URLルーティング

routes.MapRoute(
    "Default",            // Route name 
    "{controller}.mvc/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

routes.MapRoute(
    "Tagging", 
    "{controller}.mvc/{action}/{tags}", 
    new { controller = "Products", action = "Index", tags = "" } 
); 

routes.MapRoute(
    "SlugsAfterId", 
    "{controller}.mvc/{action}/{id}/{slug}", 
    new { controller = "Products", action = "Browse", id = "", slug = "" } 
); 

を::

<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %> 
例えば、私のGlobal.asaxファイルで定義されている次のルートに与えられました

[site-root]/Details/1?slug = url-slug URLはもっと似ていますが[site-root]/Details/1/url-スラッグ

Can anyon私はどこに間違っているのか見ていますか?

+2

私はいつもこの種の問題を抱えていましたが、コントローラ名とアクション名をハードコードする以外の解決策は見つけられませんでした。多くのルートにつながります。 – Will

+0

あなたはASP.NET MVCプロジェクトのための安らかなルーティングを見ることができましたhttp://stevehodgkiss.com/2009/10/11/restful-routes-for-asp-net-mvc.html 私はこれを使用してURLを取得することができます/ blogs/1/posts/2/comments/3 – Paul

答えて

59

完全に満たされている最初のルートを使用しています。 SlugsAfterIdルートをDefaultの1つ上に配置してみてください。

これは基本的には次のとおりです: "デフォルトを確認してくださいアクションを取っていますか?はい、IDを持っていますか?はい、これを使用してクエリーストリングの他のパラメータをチャックしてください。

これは、パラメータにデフォルト値を指定すると、Defaultのルートが冗長になります。

31

Garry(上記)が正しい。 HaackのMVC用ルートデバッガを使用することができます。どのルートにヒットしたかを示すことで、ルーティングの問題を解決するのに役立ちます。

ここにはBlog Postがあります。 ここにはZip Fileがあります。

+6

ルートデバッガへのリンク+1 –

8

「id」を含むルートに制約を追加するには、おそらく番号を受け入れるだけだからです。このようにして、最初の経路は "id"が数値である場合にのみ一致し、他のすべての値に対して2番目の経路を作成します。 {slug}を含むものを一番上に置き、すべてが正しく動作するはずです。

routes.MapRoute(
    "SlugsAfterId", 
    "{controller}.mvc/{action}/{id}/{slug}", 
    new { controller = "Products", action = "Browse", id = "", slug = "" }, 
    new { id = @"\d+" } 
); 

routes.MapRoute(
    "Default",            // Route name 
    "{controller}.mvc/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" }, // Parameter defaults 
    new { id = @"\d+" } 
); 

routes.MapRoute(
    "Tagging", 
    "{controller}.mvc/{action}/{tags}", 
    new { controller = "Products", action = "Index", tags = "" } 
); 
関連する問題