2012-08-03 57 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