2012-08-09 104 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