2011-10-07 73 views
1

我正在尝试做什么,因为它的问题控制器。为什么使用错误的路线?

  • /Posts/{id}/{title}查看后(动作名称未显示)
  • /Posts/New时,当你发布新的东西。
  • /Posts/Delete/10等....

我有两条路线设置(当然,一个如果你不指望默认值)。似乎正在发生的事情是邮政控制器中的所有操作都通过第一个操作。

那是什么?我显然有错,但我无法弄清楚。

routes.MapRoute("ViewPosts", 
    "Posts/{postid}/{title}", 
    new { controller = "Posts", action = "View", postid = "", title = "" }); 

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

回答

1

第一条路线处理您从/Posts开始的所有请求。

您需要使用的限制,允许{postid}只有数:

routes.MapRoute("ViewPosts", 
    "Posts/{postid}/{title}", 
    new { controller = "Posts", action = "View", postid = "", title = "" }, 
    new { postid= @"\d+" }); 

只有当数字ID提供这条路线将处理它这种情况下,否则“默认”的路线会处理。

+0

使用该规则'/ Posts'会发生什么,而没有其他?它仍然会匹配。 (这可能是也可能不是这个意图) –

+0

这条规则仍然有效。约束仅在'{postid}'参数上定义。 – Samich

+0

谢谢,那种工作。 (好吧,没有错误抛出)。然而,现在类似'/ edit/10'的行为正在显示'/ edit?id = 10' – Joe

1

所有路由都经历了第一,因为你没有指定的postid场只能是数字,或定义,将捕获/Posts/New较早的路线。它通过New作为postidView操作。

您可以之前添加此路由定义你现在有那些:

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

或任何适当的控制器/动作会。

+0

那么我需要为该控制器中的每个其他操作设置路由吗? – Joe

+0

也许只是一个捕获所有非postid路由并将它们发送到适当命名的操作。像'routes.MapRoute(“OtherPost”,“Posts/{action}/{id}”,new {controller =“Posts”},new {action =“^ [^ 0-9]”});'which would捕获所有不以数字开头的网址,将这些网址留给现有网址。 –

相关问题