我的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对象?
答案 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似乎适用。