有人可以帮助我用我的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.
如果问题是两个整数,我可以将其中一个参数更改为字符串,但是,我更愿意理解这个问题并让它工作。
答案 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”路由。