2011-12-29 59 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