的可变数量我创建了一个GET动作控制器的API:通查询字符串参数为单控制器动作
[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();
,但在尝试使用查询字符串请求任何网址时,如果给出上述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()
,而不添加相应的参数到 方法签名。
但是,我还没有想出如果这两件事情是可能的,但它似乎可能是一个或两个都可能。
我没有任何职位,只得到。此外,这似乎只是将问题转移到实体。也就是说,现在框架将尝试将参数映射到实体,但实体必须将参数定义为属性。因此,实体必须具有不同的名称和数量的属性才能映射到,这与以前相同,但现在尝试在实体类中寻址。顺便说一句,我没有使用实体框架。 – neizan