C#Web API能否反序列化URI中包含字典的对象

C#Web API能否反序列化URI中包含字典的对象,c#,asp.net-web-api2,C#,Asp.net Web Api2,我试图在GET请求中传递一个复杂对象。C#模型对象如下所示: public class GetRequest { public string ID { get; set; } public List<string> RequestedFields { get; set; } public Dictionary<string, List<string>> RequestedGrids { get; set; } } { ID: p_k

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

public class GetRequest
{
    public string ID { get; set; }
    public List<string> RequestedFields { get; set; }
    public Dictionary<string, List<string>> RequestedGrids { get; set; }
}
 { ID: p_key, RequestedFields: p_page.dataIds, RequestedGrids: p_page.grids }
[HttpGet]
[ActionName("get")]
public Dictionary<string, object> GetStuff(string get_str)
{
    var get_req = JsonConvert.DeserializeObject<GetRequest>(get_str);
    //Do ur stuff
}
$.get('<action path>', { get_str: JSON.stringify(get_obj) }, ...
我希望这样的请求能够作为以下操作中的参数正确反序列化:

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

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

当您需要发送这么多数据,特别是复杂数据时,最好将数据作为POST请求主体的一部分发送。通过这种方式,您可以确保结构完全匹配,并且可以轻松地转换为JSON格式。

GET上的输入是什么样子的?通常,字典类型的反序列化有点痛苦-有关详细信息,请参阅…

实现这一点的最简单方法似乎是只传递JSON查询字符串,而不是使用自动绑定。因此,动作如下所示:

public class GetRequest
{
    public string ID { get; set; }
    public List<string> RequestedFields { get; set; }
    public Dictionary<string, List<string>> RequestedGrids { get; set; }
}
 { ID: p_key, RequestedFields: p_page.dataIds, RequestedGrids: p_page.grids }
[HttpGet]
[ActionName("get")]
public Dictionary<string, object> GetStuff(string get_str)
{
    var get_req = JsonConvert.DeserializeObject<GetRequest>(get_str);
    //Do ur stuff
}
$.get('<action path>', { get_str: JSON.stringify(get_obj) }, ...
[HttpGet]
[ActionName(“get”)]
公共字典GetStuff(字符串get\u str)
{
var get_req=JsonConvert.DeserializeObject(get_str);
//做你的事
}
JS是这样的:

public class GetRequest
{
    public string ID { get; set; }
    public List<string> RequestedFields { get; set; }
    public Dictionary<string, List<string>> RequestedGrids { get; set; }
}
 { ID: p_key, RequestedFields: p_page.dataIds, RequestedGrids: p_page.grids }
[HttpGet]
[ActionName("get")]
public Dictionary<string, object> GetStuff(string get_str)
{
    var get_req = JsonConvert.DeserializeObject<GetRequest>(get_str);
    //Do ur stuff
}
$.get('<action path>', { get_str: JSON.stringify(get_obj) }, ...
$.get(“”,{get_str:JSON.stringify(get_obj)}。。。

IMO如果请求需要一个复杂对象,您应该将其设置为POST,以便在消息正文中发送。是的,您可以反序列化复杂数据,在get中使用复杂数据,如果其用于特定原因,例如创建动态列表api,并希望能够传递URL,以便数据集保持过滤默认模型绑定器支持ort复杂对象,但为了避免长查询字符串,您应该在模型中重命名或别名您的成员名称,我已经编写了一种序列化到查询字符串的方法。或者,您可以编写自定义模型绑定器来从查询字符串反序列化json。我希望避免使用POST。我希望将POST消息限制为实际需要的请求这使我能够轻松地在基于HTTP的中间件中执行简单的管理员与用户角色verb@Ian不幸的是,要跨HTTP调用发送这样复杂的数据结构,这些调用需要能够包含一个主体,该主体可以包含这些数据甚至是一个补丁(也没有响应体)如果你只是请求数据,考虑将数据结构简化为序列化处理更容易一些的事情。请参阅另外一个问题。仍然不确定实际输入,URL逃逸到MVC端的样子,但请尝试:<代码>公共类GETRIPUTE {公共字符串ID{get;set;}公共字符串[]RequestedFields{get;set;}公共字典RequestedGrids{get;set;}Friggin'mini markdown…其目的是将列表定义更改为简单的字符串数组。过去我看到它让序列化程序更快乐。这个答案并不完整,如果OP使用Get,则需要编写自定义模型绑定器来从Querystring@AdamHoffman-我试着换成一个数组我想约翰尼可能是对的。