ASP.NET WebAPI - 如何使用$ .getJSON传递对象

Nil*_*Pun 3 asp.net-mvc jquery asp.net-web-api

我在下面有一个ASP.NET WebAPI控件:

public SomeObject GetBenchMarkData(Comment comment)
        {
            //do stuff
        }
Run Code Online (Sandbox Code Playgroud)

在客户端我正在尝试以下内容:

var comment = { ID: 0, Text: $('#text').val(), Author: $('#author').val(), Email: $('#email').val(), GravatarUrl: '' };
            var json = JSON.stringify(comment);
            $.getJSON("api/MintEIQAPI/" + json,
Run Code Online (Sandbox Code Playgroud)

问题是使用上面的getJSON查询永远不会调用GetBenchMarkData操作.

有人可以帮助我,我做错了什么?

谢谢.

小智 17

默认情况下,如果要通过GET传递复杂类型,则需要使用FromUri属性修饰action参数.

在客户端:

$.get('api/movies/test',
      {Name:'Henrique', Age:'24'}, 
      function (res) {
           console.log(res);
      }
);
Run Code Online (Sandbox Code Playgroud)

在控制器上:

public void Get([FromUri] Customer c)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这样你就告诉WebApi从查询字符串反序列化参数.另请注意,您不会将传递给服务器的对象变为stringfy.

这篇博客文章解释了WebApi和MVC模型绑定的不同之处:http: //blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx


Jur*_*uri 6

问题是getJSON执行GET对服务器的请求.要传递整个对象,您必须执行POST请求.

对于GET,传递给jQuery Ajax调用的JavaScript对象通常会转换为URL编码参数,然后可以通过服务器端方法单独获取

$.ajax({
  url: "/someurl/getbenchmarkdata",
  data: JSON.stringify({ filterValue: "test" }),
  type: "GET"
  ...
Run Code Online (Sandbox Code Playgroud)

});

在你的服务器端

public SomeObject GetBenchMarkData(String filterValue)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

相反,如果你想传输一个整个对象,你应该像一个POST一样执行ajax调用

$.ajax({
    url: "/someurl/benchmarkdata",
    type: "POST",
    data: JSON.stringify({ title: "My title"}),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    ...
});
Run Code Online (Sandbox Code Playgroud)

并且您的服务器端方法必须使用具有Title类型属性的对象String.

我的博文也可能对此有所帮助.