C# WebApi 查询参数解析

Posted

技术标签:

【中文标题】C# WebApi 查询参数解析【英文标题】:C# WebApi Query Parameter Parsing 【发布时间】:2017-10-13 03:19:33 【问题描述】:

我有一个来自 jquery 网格的查询字符串,我试图将其解析为 C# Web API 中的参数,但我无法获取要填充的属性之一。

查询字符串:

?current=1&rowCount=10&sort[received]=desc&sort[email]=asc&sort[id]=desc&searchPhrase=

方法:

public IEnumerable<IUserDto> Get(int current, int rowCount, NameValueCollection sort, string searchPhrase)

“排序”参数始终为空,所有其他参数均正确填充。我已经为参数尝试了多种类型,但无论我尝试了什么,我总是以一个空参数结束。

任何关于参数类型的方向或建议都将不胜感激。

【问题讨论】:

【参考方案1】:

如果要反序列化复杂的聚合值,例如查询字符串中的NameValueCollection,则需要用FromUriAttribute 装饰参数。这并不能保证它会以任何方式工作,但除非您定义了自定义参数处理程序,否则它将无法工作。

public IEnumerable<IUserDto> Get(
    int current,
    int rowCount,
    [FromUri] NameValueCollection sort,
    string searchPhrase
)  ... 

此外,您需要确保序列化到 URL 中的内容实际上是 JSON 格式的字典。从您发布的 URL 看来,您正在从本地对象添加 receivedidemail 属性作为单独的查询字符串参数

&sort[received]=desc&sort[email]=asc&sort[id]=desc

WebAPI 的参数绑定不会自动为您将这些聚合到字典中。

你可以像这样构建它

var sortParam = ['received', 'id', 'email'].reduce(function (o, key) 
  o[key] = sort[key];
  return o;
, );

var queryParams = '?current=' + 1 + 
                  '&rowCount' = 10 + 
                  '&sort=' + JSON.stringify(sortParam) +
                  '&searchPhrase=' + something;

我还建议更改顺序,以便 sort 参数位于最后。

【讨论】:

我尝试了解决方案,但排序参数仍然返回为空,我也尝试过; [FromUri] Dictionary[string, string] sort[FromUri] List&lt;KeyValuePair&lt;string,string&gt;&gt; sort ^^ 表示[FromUri] Dictionary&lt;string,string&gt; sort

以上是关于C# WebApi 查询参数解析的主要内容,如果未能解决你的问题,请参考以下文章

WebApi 中FromUri参数自动解析成实体的要求

在 C# 中解析命令行参数/选项

如何在 C# 中解析命令行参数 [重复]

如何在 C# 中解析 powershell 样式的命令行参数 [重复]

C#控制台程序的参数解析类库 CommandLine简单使用说明

C# Mongdb 之MongDb.Driver的 UpdateReault 参数解析