WebAPI GET可选的整数参数

时间:2012-08-03 22:52:41

标签: asp.net-web-api asp.net-routing

有人可以帮助我用我的GAP方法填写空白用于webapi。我想传递没有参数并得到所有结果。传入一个int并得到一个结果并传入一个命名参数来过滤typeId / zoneId或两者,但我很难让它工作。

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 个答案:

答案 0 :(得分:2)

  

//时间/

如果您查看路由表:第一个路由匹配,但您没有参数的操作=&gt; 404抛出。

  

//时间/ 1

运行正确,第一个路由匹配,在这里,它选择动作:TimeView Get(int id)因为名称:路由匹配上的id与参数“id”使用此方法。请记住,Web API在很大程度上依赖于命名约定。

  

//时间/ TYPEID = 1

     

//时间/了zoneid = 1

错误的网址=&gt;抛出404,我猜你想把它作为查询字符串,应该是:Time?typeId = 1 但即便错误,因为第一个路由与参数“Id”匹配,而不是“typeId”,因此没有找到任何操作方法。

  

时间/ TYPEID = 1&安培; =了zoneid 1

网址错误,与上述原因相同。

您应该拥有的正确网址:GET时间/ 1/1将与您的第二条路线匹配。

有关路由和操作的更多信息: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

答案 1 :(得分:1)

如果要将typeId和zoneId作为查询字符串参数传递,则URI应为:

/时间?TYPEID = 1

/时间?=了zoneid 1

...在这种情况下,路由模板中不需要typeId和zoneId。

另一方面,如果你想将它们作为URI段(这是你的“TemplateTimeApi”路线所示),那么你的URI应该是:

/时间/ 1/1

使用第二个选项,您必须在URI中包含这两个参数才能触发路由,因为像“/ Time / 1”这样的URI将匹配“DefaultApi”路由。