2012-08-03 89 views
0

有人可以幫我填我的GET方法的WebAPI的空白。我想傳遞任何參數並獲得所有結果。通過在一個int,並得到一個結果,並通過在一個名爲參數由TYPEID /或了zoneid既過濾,但我在努力得到這個工作。的WebAPI GET可選整數參數

TimeController : ApiController 

// Time/ 

//Time/1 

//Time/typeId=1 

//Time/zoneId=1 

Time/typeId=1&zoneId=1 

我得到的最接近與

全球

RouteTable.Routes.MapHttpRoute(name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = System.Web.Http.RouteParameter.Optional} 
      ); 

     RouteTable.Routes.MapHttpRoute(name: "TemplateTimeApi", 
      routeTemplate: "api/{controller}/{typeId}/{zoneId}", 
      defaults: new {typeId = RouteParameter.Optional, zoneId = RouteParameter.Optional } 
      ); 

控制器

List<TimeView> Get(int typeId, int? zoneId = null) 

TimeView Get(int id) 

,但我無參數得到404。

我可以改變的參數之一爲一個字符串,如果該問題是與兩個整數,但是,我更願意理解這個問題,並得到它的工作。

回答

2

//時間/

如果你看一下你的路由表:第一路由匹配,但是你沒有不帶參數=> 404拋出的行動。

//次/ 1

運行正確,第一條路線是匹配的,在這裏,它選擇的動作:獲取的TimeView(INT ID)becasue名稱:關於路由匹配ID,以使用此方法的參數「id」。請記住,Web API嚴重依賴於命名約定。

//時間/ TYPEID = 1

//時間/ =了zoneid 1

錯誤的URL => 404拋出,我猜你想提出的查詢字符串,應:Time?typeId = 1 但即使是錯誤的,因爲第一個路由與參數「Id」匹配,而不是「typeId」,所以沒有找到操作方法。

時間/ TYPEID = 1 &了zoneid = 1

錯誤的URL也由於同樣的原因與以上。

您應該擁有的正確網址:GET Time/1/1將與您的第二條路線相匹配。

有關路由和行動更多的理解: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

+0

謝謝Cuong,我需要重新閱讀,因爲顯然沒有得到它。爲了解決我現在想要通過zone/1獲取Get(int id)的問題,並可選地傳遞none,typeId和zoneId中的一個或兩個來返回列表,我最好的選擇是什麼? – 2012-08-04 07:21:45

+0

所以你的意思是,你想通過zoneId Get(int id)typeId&zoneId另一種方法?更清楚的是,你的路線應該是:「api/{controller}/{zoneId}」。和你的方法:Get(int zoneId) – 2012-08-04 07:34:54

+0

是的,但我想我得到的地方使用var queryValues = HttpUtility.ParseQueryString(Request.RequestUri.Query); – 2012-08-04 07:37:55

1

如果你想通過TYPEID並作爲了zoneid查詢字符串參數,你的URI應該是:??

/時間的typeid = 1

/時間=了zoneid 1

...在這種情況下,你不需要TYPEID和在了zoneid路由模板。

在另一方面,如果你希望他們爲URI段(這是你的 「TemplateTimeApi」 路線所示),那麼你的URI應該是:

/時間/ 1/1

隨着第二個選項,你就必須包括在URI兩個參數來觸發的路線,因爲一個URI,如「/時間/ 1」將匹配「DefaultApi」路線。

+0

感謝邁克,沒有想過查詢字符串參數,不知道他們是如何使用的。順便說一下,在線WebAPI資源的工作非常棒。 – 2012-08-04 07:00:04