2012-08-09 103 views
2

我主要使用的是默认的WebAPI路由映射,具体如下:如何在ASP.NET MVC 4中映射这些WebApi路由?

 routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

这是工作的罚款,我的网址如下所示:

[GET] /api/customers Get all customers 
    [GET] /api/customers/1 Get a specific customer 
    [POST] /api/customers Create a customer 

都好,到目前为止,但现在我想添加一个“搜索”工具。为此,我将POST一个代表搜索条件的对象,因为有太多的选项可以将它作为GET在URL上执行。我的计划是,URL应该是这样的:

[POST] /api/customers/search 

然而,默认的上述路由,服务器抱怨说,“多的行动中发现匹配的请求”,我认为这是因为我现在有两个接受POST数据的控制器方法(一个用于“创建”,另一个用于“搜索”),并且路由无法区分它们。

我尝试添加一个包含{action}组件的新路线图,但这并没有解决问题 - 大概是因为该URL对于路线图都是有效的路线图。 (我会以某种方式需要从默认的路由映射匹配停止“/搜索”变种

建议请

+0

你是什么意思“我将发布一个代表搜索条件的对象”?请你举例说明POST(创建新的对象)根据搜索条件吗? – 2012-08-09 15:48:13

+0

我的意思是,而不是有查询字符串参数我的搜索条件等等,我将发布一个对象,在我的请求的正文中定义搜索条件。因此,URL将简单地作为/ api/customers/search,但请求主体将包含一个XML或JSON块,告诉服务器要搜索哪些字词等。 – 2012-08-09 16:17:11

+0

为什么不使用[POST]/api/customers?search = {你的搜索词}? – 2012-08-09 16:22:44

回答

1

如何添加以下路径:?就在DefaultApi路线前

routes.MapHttpRoute(
     name: "SearchRouteName", 
     routeTemplate: "api/{controller}/search/{id}", 
     defaults: new { controller = "customers", id = RouteParameter.Optional } 
    ); 

映射?

+0

这仍然存在同样的问题,即默认路由仍与URL匹配,因此我收到“多个操作匹配”错误。我不认为你添加路线图的顺序有什么不同(但我确实按照你建议的顺序尝试了以防万一)。 – 2012-08-09 13:57:55

+0

添加路由的顺序确实有所不同,因为路由按照它们定义的顺序添加到集合中。然后,路由引擎将查找匹配的路由,直到它找到一个然后停止。因此,将选择与您的网址匹配的第一条路线(基于列表中的位置)。你可以请出示你的行动签名吗? – JTMon 2012-08-09 14:01:35