2011-12-29 72 views
1

我在控制器中有3個動作。我想前兩個是/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) 

我現在已經定義的路線是:

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" }); 

我以爲我把他們會做的伎倆約束,但這些請求都是通過第一條路線發送的。我究竟做錯了什麼?

+0

切換兩條路線...... – 2011-12-29 01:15:21

回答

5

您的「NewPost」路線需要先行,因爲該路線將與您的「BrowsePosts」路線匹配。

按順序分析路線,並在第一個匹配時分析路線。

首先映射您的「NewPost」路線,它應該被修復。

+0

我以爲我嘗試過。生病再次,雖然 – Joe 2011-12-29 03:44:13

+0

沒有時間玩它(我今晚會),但爲什麼是/新的匹配瀏覽?約束不應該停止嗎? – Joe 2011-12-29 17:23:24

+0

@Joe你可以把路線看作一個堆棧。換句話說,他們按順序分析。 ASP.NET將看到路線「posts/new」,並首先嚐試將其與「posts/{filter}」進行匹配。由於路由的模糊性,它會採用這種方式,並認爲應該在路由參數filter處傳遞「new」。由於這個原因,它甚至不會到達「NewPost」路線。但是,如果您切換它們,「posts/new」路線將與「NewPost」路線匹配,因爲路線堆棧中的路線首先出現。 – 2011-12-29 17:38:24