Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 发布到Web API OData时,收到的实体为空_Jquery_Post_Asp.net Web Api_Odata - Fatal编程技术网

Jquery 发布到Web API OData时,收到的实体为空

Jquery 发布到Web API OData时,收到的实体为空,jquery,post,asp.net-web-api,odata,Jquery,Post,Asp.net Web Api,Odata,我正在尝试使用OData将数据发送到Web API。但是收到的实体总是空的 我使用JQuery进行了此调用: $.ajax({ url: "/odata/Products", type: "POST", //contentType: "application/json;odata=verbose", contentType: 'application/json; charset=utf

我正在尝试使用OData将数据发送到Web API。但是收到的实体总是空的

我使用JQuery进行了此调用:

        $.ajax({
            url: "/odata/Products",
            type: "POST",
            //contentType: "application/json;odata=verbose",
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(productToAdd),
            dataType: "json",
            success: function () {
                alert("Server call has been OK!!");
            },
            error: function () {
                alert("Server call has been failed!!");
            }
        });
productToAdd对象类似于:

{“名称”:“苹果”,“描述”:“好!!”,“价格”:“12.3”,“类别”:“水果”}

我的控制器是:

public class ProductsController : EntitySetController<Product, string>
{
    private IProductService _prodSvc;

    public ProductsController(IProductService prodSvc)
    {
        _prodSvc = prodSvc;
    }

    [Queryable]
    public override IQueryable<Product> Get()
    {
        return _prodSvc.GetAllProducts();
    }

    protected override Product CreateEntity(Product product)
    {
       var addedProduct = _prodSvc.AddProduct(product);
       return addedProduct;
    }
}
我认为当它反序列化JSON对象时有问题,但我不知道是什么。你能帮我吗


谢谢

出于某种原因,web api的模型绑定器的行为似乎与我们在mvc中的模型绑定所期望的不一样,但是这里的上下文略有不同,表单post与JSON对象负载并不完全相同

例如: 如果我在C#中定义以下类

。。。然后给出了一个方法签名

public void SomeMethod(Foo data) { ... }
。。。在MVC中,我可以发布任意的数据块,任何至少与某些属性匹配的数据都会被绑定。 这种情况发生在Web API中,但前提是您发布了“application/x-www-form-urlencoded”的内容类型,并且我对数据进行了字符串化

但是,如果您想发布正确的JSON,则必须明确且正确,如果您提供的属性少了1个或多了一个,则会出现modelstate验证错误,该错误非常模糊,只是说“发布的数据验证失败”,没有帮助

通过在控制器的第一行上放置一个断点,然后在Modelstate中检查该值,您应该能够看到这一点。 没有异常,只是验证失败且参数为null

但是,数据应该仍然存在,并且没有任何东西可以阻止您自己使用2或3行代码从请求流中手动解析数据。 在本例中,我建议您确认json与DTO完全匹配

如果是这样的话,这应该是可行的

$.ajax({
    type: method,
    url: url,
    data: someObject,
    dataType: 'json',
    beforeSend: function (xhr) {
        xhr.setRequestHeader("Content-Type", "application/json;odata=minimalmetadata");
        xhr.setRequestHeader("Accept", "application/json;odata=minimalmetadata");
        xhr.setRequestHeader("Accept-Charset", "UTF-8");
        // add say auth headers here for secure endpoints
    },
    success: function (newObj) {
        // job done
    },
    error: function (e) {
        // nope, examine what server said
    }
});

一般来说,我建议您在遇到这样的问题时,首先尝试确定问题是客户端问题还是服务器端问题。使用类似的工具(或任何其他监视HTTP请求和响应的工具)查看服务器返回的内容。服务器发送回的是成功的状态代码还是错误?能否检查控制器上的ModelState属性?应该有任何关于反序列化失败的信息。
public void SomeMethod(Foo data) { ... }
$.ajax({
    type: method,
    url: url,
    data: someObject,
    dataType: 'json',
    beforeSend: function (xhr) {
        xhr.setRequestHeader("Content-Type", "application/json;odata=minimalmetadata");
        xhr.setRequestHeader("Accept", "application/json;odata=minimalmetadata");
        xhr.setRequestHeader("Accept-Charset", "UTF-8");
        // add say auth headers here for secure endpoints
    },
    success: function (newObj) {
        // job done
    },
    error: function (e) {
        // nope, examine what server said
    }
});