如何使用GET方法发送JSON对象

时间:2017-03-23 21:31:10

标签: c# jquery json asp.net-web-api getmethod

我的WebApi2控制器方法

    [HttpGet]
    public IEnumerable<Products> GetProducts(ProductSearchCriteria searchCriteria)
    {
        //searchCriteria is always null here!!! Why?
        return db.Instance.LoadProducts(searchCriteria);
    }

我的搜索条件类

public class ProductSearchCriteria
{
    private int id;
    private string name;
    private DateTime createdOn;

    [JsonProperty]
    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }

    [JsonProperty]
    public DateTime CreatedOn
    {
        get { return this.createdOn; }
        set { this.createdOn = value; }
    }

    [JsonProperty]
    public int ID
    {
        get { return this.id; }
        set { this.id = value; }
    }
}

html页面中的我的脚本

<script>
    $("#btnTest").on("click", function () {
        var searchCriteria = {};
        searchCriteria.ID = 0;
        searchCriteria.Name = "";
        //searchCriteria.CreatedOn = "";
        var url = "http://localhost:8080/api/products"
        $.getJSON(url, searchCriteria).done(processResponse);
    });

    function processResponse(response){
    }
</script>

我到达我的控制器方法(调试模式),但ProductSearchCriteria searchCriteria参数始终为null。如何使用JQuery和WebApi2的get方法发送我的JSON对象?

4 个答案:

答案 0 :(得分:0)

试试此代码

[HttpGet]
public IEnumerable<Products> GetProducts([FromUri]ProductSearchCriteria searchCriteria)
{
    //searchCriteria is always null here!!! Why?
    return db.Instance.LoadProducts(searchCriteria);
}

答案 1 :(得分:0)

您可以尝试使用 [FromUri] 装饰参数。

[HttpGet]
public IEnumerable<Products> GetProducts([FromUri] ProductSearchCriteria searchCriteria)
{
    //searchCriteria is always null here!!! Why?
    return db.Instance.LoadProducts(searchCriteria);
}

另一种选择是对您的JSON对象进行字符串化并在服务器端代码中对其进行缩减。您可以使用JSON.NET等转换器执行此操作,也可以使用自定义类型转换器,模型绑定器或值提供程序。可以找到更多信息here

答案 2 :(得分:0)

使用post而不是:

$("#btnTest").on("click", function () {
    var searchCriteria = {};
    searchCriteria.ID = 0;
    searchCriteria.Name = "";
    //searchCriteria.CreatedOn = "";
    var url = "http://localhost:8080/api/products"
    $.post(url, data, processResponse, 'json');

});

将方法属性更改为:

[HttpPost]
public IEnumerable<Products> GetProducts(ProductSearchCriteria searchCriteria)

答案 3 :(得分:0)

您使用$.getJSON(url, searchCriteria)getJSON sends the searchCriteria as a url-encoded query string向服务器发送查询,因为您的searchCriteria符合plain object的定义

在服务器端,.NET Web API的默认参数绑定将在URL中查找“简单”数据类型(例如int,double,string),否则它将回退到正文内容。

要获取Web API模型绑定以从网址中提取复杂类型,就像您的ProductSearchCriteria类一样,您需要在参数前面添加[FromUri]属性,如下所示:

[HttpGet]
public IEnumerable<Products> GetProducts([FromUri] ProductSearchCriteria searchCriteria) {}

有关详细信息,请参阅此处Parameter Binding in ASP.NET Web API

我认为值得尝试保留GET语义而不是切换到POST,正如一些人所建议的那样,因为你的代码实际上做的是看似 读取 操作,只要你没有修改数据或状态... GET似乎适用。