Asp.net web api WebAPI获取可选的整数参数

Asp.net web api WebAPI获取可选的整数参数,asp.net-web-api,asp.net-routing,Asp.net Web Api,Asp.net Routing,有人能帮我用webapi的GET方法填空吗。我不想传入任何参数,而是想得到所有结果。传入一个int并获得一个结果,传入一个命名参数以按typeId/zoneId或两者进行筛选,但我很难让它正常工作 TimeController : ApiController // Time/ //Time/1 //Time/typeId=1 //Time/zoneId=1 Time/typeId=1&zoneId=1 我得到的最接近的是 全球的 RouteTable.Routes.M

有人能帮我用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)
列表获取(int-typeId,int?zoneId=null)
时间视图获取(int id)
但我得到了一个404,没有参数


如果问题是两个整数,我可以将其中一个参数更改为字符串,但是,我更希望了解问题并使其正常工作。

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

/时间?类型ID=1

/时间?区域ID=1

。。。在这种情况下,管线模板中不需要typeId和zoneId

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

/时间/1/1


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

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

/时间?类型ID=1

/时间?区域ID=1

。。。在这种情况下,管线模板中不需要typeId和zoneId

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

/时间/1/1

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

//时间/

如果您查看一下您的路由表:第一个路由是匹配的,但是没有抛出任何参数=>404的操作

//时间/1

正确运行,第一条路由匹配,在这里,它选择action:TimeView Get(int-id)作为名称:id on routing match,并使用此方法将参数“id”匹配到。记住,WebAPI很大程度上基于命名约定

//时间/类型ID=1

//时间/区域ID=1

错误的URL=>404抛出,我想你应该把它作为查询字符串,应该是:Time?typeId=1 但甚至是错误的,因为第一个路由与参数“Id”匹配,而不是“typeId”,所以没有找到任何操作方法

时间/类型ID=1和区域ID=1

错误的网址太多,与上述相同的原因

您应该拥有的正确URL:GET Time/1/1将与第二条路线匹配

有关路由和操作的更多了解:

//时间/

如果您查看一下您的路由表:第一个路由是匹配的,但是没有抛出任何参数=>404的操作

//时间/1

正确运行,第一条路由匹配,在这里,它选择action:TimeView Get(int-id)作为名称:id on routing match,并使用此方法将参数“id”匹配到。记住,WebAPI很大程度上基于命名约定

//时间/类型ID=1

//时间/区域ID=1

错误的URL=>404抛出,我想你应该把它作为查询字符串,应该是:Time?typeId=1 但甚至是错误的,因为第一个路由与参数“Id”匹配,而不是“typeId”,所以没有找到任何操作方法

时间/类型ID=1和区域ID=1

错误的网址太多,与上述相同的原因

您应该拥有的正确URL:GET Time/1/1将与第二条路线匹配

有关路由和操作的更多了解:

谢谢,迈克,他没有考虑过查询字符串参数,也不知道它们是如何使用的。顺便说一句,在线使用WebAPI资源做得很好。谢谢Mike,他没有考虑querystring参数,也不知道它们是如何使用的。顺便说一句,你的WebAPI在线资源做得很好。谢谢Cuong,我需要重新阅读这篇文章,因为我显然没有得到它。为了解决我目前的问题,即希望为Get(int-id)传递zone/1,并且可以选择传递none、typeId和zoneId中的一个或两个来返回列表,我的最佳选择是什么?您的意思是,要为Get(int-id)传递zoneId,为另一个方法传递typeId和zoneId吗?为了更清楚,您的路由应该是:“api/{controller}/{zoneId}”。您的方法:Get(int zoneId)是的,但是我认为我使用var queryValues=HttpUtility.ParseQueryString(Request.RequestUri.Query)取得了一些进展;如果是这样的话,您不需要第二条路径,只需要打开查询字符串是的,我已经删除了这个。谢谢你的帮助,我将在本周晚些时候用我的工作代码更新我的答案。谢谢Cuong,我需要重新阅读这篇文章,因为我显然没有得到它。为了解决我目前的问题,即希望为Get(int-id)传递zone/1,并且可以选择传递none、typeId和zoneId中的一个或两个来返回列表,我的最佳选择是什么?您的意思是,要为Get(int-id)传递zoneId,为另一个方法传递typeId和zoneId吗?为了更清楚,您的路由应该是:“api/{controller}/{zoneId}”。您的方法:Get(int zoneId)是的,但是我认为我使用var queryValues=HttpUtility.ParseQueryString(Request.RequestUri.Query)取得了一些进展;如果是这样的话,您不需要第二条路径,只需要打开查询字符串是的,我已经删除了这个。谢谢你的帮助,我将在本周晚些时候用我的工作代码更新我的答案。