C# 如何将复杂模型从客户端传递到服务器?

C# 如何将复杂模型从客户端传递到服务器?,c#,javascript,jquery,ajax,asp.net-web-api,C#,Javascript,Jquery,Ajax,Asp.net Web Api,我有一些数据“Foo”,我想从浏览器传递到服务器,并根据Foo中包含的信息检索预测的统计数据 $.ajax({ type: 'GET', url: "/api/predictedStats/", data: "foo=" + ko.toJSON(foo, fooProperties), contentType: 'application/json; charset=utf-8', dataType: 'json', succ

我有一些数据“Foo”,我想从浏览器传递到服务器,并根据Foo中包含的信息检索预测的统计数据

$.ajax({
      type: 'GET',
      url: "/api/predictedStats/",
      data: "foo=" + ko.toJSON(foo, fooProperties),
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',
      success: function(data) {
        return _this.viewModel.setPredictedStats(data);
      },
      error: function(jqXHR, statusText, errorText) {
        return _this.viewModel.setErrorValues(jqXHR, errorText);
      }
    });
我创建了一个predicted stats控制器,并使用参数Foo获取方法

public class PredictedStatsController : ApiController
{
    public PredictedStats Get(Foo foo)
    {
        return statsService.GetPredictedStats(foo);
    }
}
在Get方法上粘贴断点,我看到Foo对象总是空的。webapi跟踪日志记录不会引发任何错误,只在以下几行中出现

WEBAPI: opr[FormatterParameterBinding] opn[ExecuteBindingAsync] msg[Binding parameter 'foo'] status[0]  
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Type='foo', content-type='application/json; charset=utf-8'] status[0]  
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Value read='null'] status[0]   
我可以通过post将数据发送到Foo控制器,以便在服务器上创建Foo对象,因此我可以说json创建的客户端没有问题

在fiddler中查看得到的Get如下所示,其中jsondata是对象foo

GET /api/predictedStats?foo={jsondata} HTTP/1.1
这是可能的,还是我完全错了

谢谢 尼尔


编辑: 我觉得我几乎可以通过以下方式实现这一点

public PredictedStats Get([FromUri]Foo foo)
{
    return statsService.GetPredictedStats(foo);
}
对象foo恢复正常,但没有正确填充foo的属性


与此同时,我还使用了一篇数据几乎相同的帖子,只是去掉了“foo=”这个词,效果很好

我不确定在这种情况下是否应该使用POST或GET,但知道这一点会很有趣


我还发现,这似乎表明您不能使用jquery将主体附加到GET请求,因此POST可能是唯一明智的选择

当您使用
[FromUri]
时(您必须将其用于“复杂”对象,因为默认情况下Web API不会“绑定”复杂对象,它总是希望从主体中反序列化它们),您不需要在Uri中传递
参数=
,只需将值的成员作为查询字符串参数传递即可。这就是
'member1=value&member2=value'
-其中
member1
member2
Foo
的成员

请注意,jQuery中没有“bug”-虽然HTTP规范不禁止请求主体,但很可能是浏览器禁止(如果是这种情况,jQuery无法发送),而且很可能服务器永远也不会读取它。这只是不被接受的做法。它还可能存在缓存方面的有趣问题,因为浏览器不会缓存POST、PUT、DELETE等,但如果响应头不禁止GET,则会缓存GET,这可能会对客户端应用程序产生严重的副作用。我建议你看看这篇文章:更多信息和一些关于这个主题的有用链接

同样,当使用jQuery时——您也不需要将对象转换为JSON——只需将javascript对象传递到选项的
data
成员中,jQuery就会将其转换为正确的格式


或者说,Web API理解jQuery传递它的格式。

谢谢,尽管我用
[FromUri]
修饰了“复杂对象”参数,但为什么没有填充它呢。我试图传入json,例如?param={Name:Foo},但它不起作用,我必须将它更改为?Name=Foo,正如您所说的。请注意,如果您有多个
[FromUri]
复杂对象参数,则需要确保它们的属性不具有相同的名称,否则最终会为两个实例分配相同的属性值。请注意,一个简单的
公共字符串member1将不起作用,
member1
仍将为
null
。把它们变成财产,它会很好地工作。关于它们必须是财产…为什么我4小时前没有读到这篇文章。谈论感觉愚蠢,谢谢托马斯的这个简单但如此完美的评论。别忘了做/?还是使用?就在api路由之后,因为它不起作用,例如url:port/apiroute/?“member1=value&member2=value”将起作用。。。如果你忘了这个?它不会。。。