为什么走错了路?

本文关键字:错了路 为什么 | 更新日期: 2023-09-27 18:10:47

我正试图做什么SO做它的问题控制器。

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

我设置了两条路由(好吧,如果不算默认路由,只有一条)。似乎正在发生的是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
);

为什么走错了路?

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

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

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

在这种情况下,只有当提供了数字Id时,该路由才会处理它,否则"Default"路由将处理。

所有路由都经过第一个,因为您没有指定postid字段只能是数字,或者定义了一个将捕获/Posts/New的较早路由。它传递New作为postidView的动作。

你可以在之前添加路由定义:

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

或者任何合适的控制器/动作