我正在ASP.NET MVC4中创建一个rest API,并且遇到路由问题。作为参考,我已经阅读了这些问题,但他们没有回答我的问题:
我想要制作的网址如下:
正如您所看到的,在某些情况下,控制器名称后面的URL映射到参数(上面#1,2中的id和名称),有时还会显示操作名称(上面的#4)。此外,它可能根本不存在(上面的#3),在这种情况下我假设默认动作。以下是适用于几乎所有情况的路由:
// Match for an id next.
config.Routes.MapHttpRoute(
name: "WithIdApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "Index" },
constraints: new
{
id = @"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$"
}
);
// Match for a name next.
config.Routes.MapHttpRoute(
name: "WithNameApi",
routeTemplate: "api/{controller}/{name}",
defaults: new { action = "Index" }
);
// Match for an action last.
config.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "Index" }
);
此代码适用于除上述示例#4之外的所有内容,因为MVC无法区分'name'参数和'action'绑定。如果我改变了顺序(即将匹配的动作放在上面),那么'name'参数示例将永远不会起作用。
有谁知道我能做到这一点的任何方式?
答案 0 :(得分:1)
对于其他试图这样做的人来说,答案是不可能的。最好的办法是将“名称”搜索移动到它自己的行动中。例如:
我会假设MVC会尝试匹配参数或操作,如果其中一个或另一个失败并且其他绑定可用,但遗憾的是情况并非如此。