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} 为所有路由设置默认值?
您认为{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
操作。