0

有人可以用我的 webapi GET 方法帮我填空吗?我想不传入任何参数并获得所有结果。传入一个 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。

如果问题与两个整数有关,我可以将其中一个参数更改为字符串,但是,我更愿意理解问题并让它发挥作用。

4

2 回答 2

2

// 时间/

如果你看一下你的路由表:第一个路由匹配,但是你没有没有参数 => 404 抛出的动作。

//时间/1

运行正确,第一个路由匹配,在这里,它选择操作: TimeView Get(int id) 因为名称:路由上的 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

于 2012-08-04T07:08:10.870 回答
1

如果您想将 typeId 和 zoneId 作为查询字符串参数传递,您的 URI 应该是:

/时间?typeId=1

/时间?zoneId=1

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

另一方面,如果您希望它们作为 URI 段(这是您的“TemplateTimeApi”路由显示的内容),那么您的 URI 应该是:

/时间/1/1

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

于 2012-08-04T05:08:21.163 回答