3

我最近被这两条 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 = "User" 会使这两个语句等效。显然使用 {controller} 为所有路由设置默认值?

4

1 回答 1

5

您认为{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动作。

于 2013-01-25T19:47:05.920 回答