C# Web API 可以反序列化包含字典的 URI 中的对象吗

Can C# Web API Deserialize Object in URI that Contains a Dictionary

我试图在 GET 请求中传递一个复杂的对象。 C# 模型对象如下所示:

public class GetRequest
{
    public string ID { get; set; }
    public List<string> RequestedFields { get; set; }
    public Dictionary<string, List<string>> RequestedGrids { get; set; }
}

查看 Chrome 中的请求,我在 "Query String Parameters" 下看到以下内容:

ID: 1
RequestedFields[]: someTxtField
RequestedFields[]: someOtherField
RequestedGrids[someGrid][]: keyColumn
RequestedGrids[someGrid][]: someDataColumn

我希望这样的请求能够作为以下操作中的参数正确反序列化:

[HttpGet]
[ActionName("get")]
public Dictionary<string,object> GetStuff([FromUri] GetRequest get_req)

但是,每当请求进入此操作时,参数的 RequestedGrids 属性 的计数始终为 0,而其他属性填充正常。有没有办法让这个工作?

加法

进入 JQuery $.get 调用的对象如下所示:

 { ID: p_key, RequestedFields: p_page.dataIds, RequestedGrids: p_page.grids }

其中 RequestedFields 是普通字符串数组,RequestedGrids 是普通对象,其中每个对象 属性 值都是字符串数组。

当您需要发送这么多数据,尤其是复杂数据时,最好将数据作为 POST 请求正文的一部分发送。这样就可以确保结构完全匹配,并且可以轻松转换to/from JSON 格式。

GET 上的输入是什么样的?一般来说,字典类型反序列化有点痛苦 - 详情请参阅 Deserialize JSON string to Dictionary<string,object>...

完成此操作的最简单方法似乎是只传递一个 JSON 查询字符串而不是使用自动绑定。所以动作看起来像这样:

[HttpGet]
[ActionName("get")]
public Dictionary<string, object> GetStuff(string get_str)
{
    var get_req = JsonConvert.DeserializeObject<GetRequest>(get_str);
    //Do ur stuff
}

JS 看起来像这样:

$.get('<action path>', { get_str: JSON.stringify(get_obj) }, ...