【发布时间】:2016-11-08 14:33:42
【问题描述】:
我正在创建一个 API,它有一个带有一个 GET 操作的控制器:
[Route("api/xxxxx/{param1:int}/{param1:int}")]
public IHttpActionResult Get(int param1, int param2) {
// method body...
}
网址将采用以下格式:
/api/xxxxx/1/1?p1=5&p2=hello&p3=20161108
/api/xxxxx/1/1?p1=active
查询字符串参数的数量和名称会有所不同。
我想将查询字符串参数传递给控制器方法,但由于名称和编号不同,我无法将它们硬编码到方法签名中。有没有办法做到这一点?我尝试调用var qsParams = ControllerContext.Request.GetQueryNameValuePairs();,但在尝试使用查询字符串请求任何URL 时出现资源未找到错误,给定上面显示的Route 属性。
我想出了一个替代方案:使用路由值而不是查询字符串参数,然后使用包罗万象的{*tags} 并将其作为方法参数传递:
[Route("api/xxxxx/{param1:int}/{param1:int}/{*tags}")]
public IHttpActionResult Get(int param1, int param2, string tags) {
// method body...
}
网址格式
/api/xxxxx/1/1/5/john/20161108
/api/xxxxx/1/1/active
这可行,但我宁愿使用查询字符串来使用命名键,而不是依赖于参数的顺序(此外,使用查询字符串似乎更适合我正在做的事情) .
那么,如何将可变查询字符串参数传递给控制器操作?我说“传递”参数,但它们不一定需要作为方法参数传递,只要我可以从方法主体访问查询字符串参数,同时获取带有查询字符串的 URL 以解析为有问题的行动。
编辑:
值得一提的是,为每个可能的参数集创建多个操作方法不是一种选择。
编辑 2:
如果可能的话,我看到了两种直接的解决方案:
- 将整个查询字符串作为单个字符串传递给操作方法 范围。然后我可以手动解析查询字符串。
- 可以使用
ControllerContext.Request.GetQueryNameValuePairs()在方法体内,而不是添加相应的参数 方法签名。
但是,我还没有弄清楚这两件事是否可能,尽管看起来可能是其中之一或两者都可能。
【问题讨论】:
标签: asp.net-web-api2