C# 为什么使用了错误的路线?

C# 为什么使用了错误的路线?,c#,asp.net-mvc-3,routes,C#,Asp.net Mvc 3,Routes,我试着去做它的问题控制器 查看帖子时的/Posts/{id}/{title}(未显示动作名称) /Posts/New发布新内容时 /Posts/Delete/10等 我设置了两条路线(如果不算默认路线,则设置一条)。似乎正在发生的是Post控制器中的所有动作都通过第一个动作路由 那是什么?我显然弄错了,但我无法理解 routes.MapRoute("ViewPosts", "Posts/{postid}/{title}", new { controller = "Posts"

我试着去做它的问题控制器

  • 查看帖子时的
    /Posts/{id}/{title}
    (未显示动作名称)
  • /Posts/New
    发布新内容时
  • /Posts/Delete/10
我设置了两条路线(如果不算默认路线,则设置一条)。似乎正在发生的是Post控制器中的所有动作都通过第一个动作路由

那是什么?我显然弄错了,但我无法理解

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

所有路由都要通过第一个路由,因为您没有指定
postid
字段只能是数字,也没有定义将捕获
/Posts/New
的较早路由。它通过
视图
操作将
新建
作为
postid
传递

您可以在现有管线定义之前添加此管线定义:

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

或者无论适当的控制器/操作是什么。

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

您需要使用约束来允许
{postid}
是唯一的数字:

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

在这种情况下,仅当提供了数字Id时,此路由将处理它,否则“默认”路由将处理。

那么,我是否需要为该控制器中的每个其他操作创建一个路由?可能只是一个捕获所有未发布的路由并将其发送到适当命名的操作的路由。比如
routes.MapRoute(“OtherPost”、“Posts/{action}/{id}”、new{controller=“Posts”}、new{action=“^[^0-9]”)
将捕获所有不以数字开头的URL,而将这些URL保留到现有URL。如果使用该规则,而没有其他规则,
/Posts
会发生什么?它仍然会匹配。(这可能是目的,也可能不是目的)这条规则仍然有效。约束仅在
{postid}
参数上定义。谢谢,这样做很有效。(好吧,不会抛出错误)。但是,现在像
/edit/10
这样的操作出现了
/edit?id=10
尝试使用
RouteLink
而不是
ActionLink
,直接在其中指定“默认”路由。