2011-12-29 12 views
1

コントローラに3つのアクションがあります。私は、私はそれらを置く制約はトリックを行うだろうと思ったルートが期待どおりに動作しないのはなぜですか?

routes.MapRoute("BrowsePosts", 
    "posts/{filter}", 
    new { controller = "posts", action = "browse", filter = "", page = 1 }, 
    new { controller = "posts", action = "browse", page = @"\d+" }); 

routes.MapRoute("NewPost", 
    "posts/new", 
    new { controller = "", action = "" }, 
    new { controller = "posts", action = "new" }); 

:私は、最初の二つは/posts/newになりたい、と私は今定義した/posts/{filter}?page=N

//all are in the PostsController 
[HttpGet] 
public ActionResult New() 

[HttpPost] 
public ActionResult New(PostView post) 

[HttpGet] 
public ActionResult Browse(string filter, int page) 

ルートであることが最後です要求はすべて最初のルート経由で送信されています。私は間違って何をしていますか?

+0

2つのルートを切り替える... –

答えて

5

"NewPost"ルートは、そのルートが "BrowsePosts"ルートと一致するため、最初にする必要があります。

ルートは、利用されるルートである最初の一致で、順番に分析されます。

"NewPost"ルートを最初にマップしてください。修正する必要があります。

+0

私はそれを試みたと思った。もう一度やり直してください。 – Joe

+0

これで遊ぶ時間はありませんでしたが(私は今夜になります)、新しいマッチングのブラウズはなぜですか?制約はそれを止めてはいけませんか? – Joe

+0

@Joeあなたはルートをスタックと考えることができます。言い換えれば、それらは順番に分析される。 ASP.NETは "posts/new"というルートを見て、最初に "posts/{filter}"とマッチさせようとします。それは経路の曖昧さのために正しいと考えられ、経路パラメータ 'filter'で「new」が渡されるべきだと考えます。これにより、「NewPost」ルートに到達することさえありません。しかし、それらを切り替えると、 "posts/new"ルートは "NewPost"ルートと一致します。これはルートスタックの最初のものです。 –

関連する問題