MVC4's mapRoute URL -- {controller}/{action} vs Controller/{

本文关键字:controller action Controller vs URL mapRoute MVC4 | 更新日期: 2023-09-27 17:55:58

我最近对这两个 MVC4 路由显然功能不同的事实感到恼火。我想知道是否有人可以强调正在发生的事情,以便我更好地理解。

routes.MapRoute(
    "post-User",
    "User",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
    );
routes.MapRoute(
    "post-User",
    "{controller}",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
    );

我认为 {controller} 位是一个占位符,并且在下一行中说控制器 = "用户"会使这两个语句等效。显然使用 {controller} 为所有路由设置默认值?

MVC4's mapRoute URL -- {controller}/{action} vs Controller/{

您认为{controller}子字符串充当控制器名称的占位符是正确的。考虑到这一点,以下路由将匹配任何控制器,但默认为未指定控制器的User控制器:

routes.MapRoute(
    "post-User",
    "{controller}",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

但是,以下内容将与路由User匹配,并且由于无法指定控制器,因此将始终路由到User控制器:

routes.MapRoute(
    "post-User",
    "User",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

在这种情况下,差异是没有意义的,因为您所做的只是强制路由User映射到控制器User,这正是您的第一条路由中将发生的情况。

但是,请考虑以下事项:

routes.MapRoute(
    "post-User",
    "User/{action}",
    new { controller = "User", action = "MyDefaultAction" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);
routes.MapRoute(
    "foo",
    "{controller}/{action}",
    new { controller = "User", action = "Index" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

现在,您的顶级路由将与User控制器的请求匹配,并指定一个可选操作,并将默认为 MyDefaultAction 。对任何其他控制器的请求将与第一个路由不匹配 - 因为路由不以常量字符串User开头 - 并且将默认返回到第二个路由 (foo)。同样,该操作是可选的;但是,现在,与对User控制器的请求不同,其他控制器的默认操作将是Index操作。

所以现在...

.../User默认为MyDefaultAction操作。

.../SomeOtherController默认为Index操作。