如何在WebAPI后端C#上接收JSON数据?

如何在WebAPI后端C#上接收JSON数据?,c#,json,asp.net-web-api,C#,Json,Asp.net Web Api,如何在C#中的WebAPI后端接收JSON数据 我已经从JavaScript前端发送了以下JSON { "User_Id": 1, "TotalPrice": 35, "DeliveryAddress": "At my house", "CartItems": [ { "Id": 1009, "Name": "Superman juni 2014", "Quantity": 1

如何在C#中的WebAPI后端接收JSON数据

我已经从JavaScript前端发送了以下JSON

{
    "User_Id": 1,
    "TotalPrice": 35,
    "DeliveryAddress": "At my house",
    "CartItems": [
        {
            "Id": 1009,
            "Name": "Superman juni 2014",
            "Quantity": 1,
            "Price": 35
        }
    ]
}
我有以下课程:

public class PurchaseOrder
    {        
        public List<CartItem> CartItems { get; set; }
        public string DeliveryAddress { get; set; }
        public int TotalPrice { get; set; }
        public int User_Id { get; set; }
    }
public class CartItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Quantity { get; set; }
        public int Price { get; set; }
    }
我的“PurchaseOrder”对象的结果只有“null”。问题是我使用的是[System.Web.Mvc.HttpPost]吗?我也尝试过[System.Web.Http.HttpPost],但得到了相同的结果。
//Martin

请求的
内容类型应为
“application/json”

若在请求体中发布json,则将方法签名更改为

[HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
{
}

将您的实现更改为此

[System.Web.Http.HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
{

}

有关更多详细信息-

请尝试使用NuGet提供的Newtonsoft.Json包。它们具有将任何字符串序列化和反序列化为Json的函数。
还可以尝试使用动态类型变量。有助于反序列化。

问题已解决,缺少的是“application/json”。对于其他有同样问题的人,这里是我的函数。我使用的是Knockout.js,因此使用了“self”这个词

self.makePurchase = function () {
            var tempUserId = self.orderUserId();
            var tempCartPrice = self.ShoppingCartPrice();
            var tempAddress = self.orderAddress();
            var tempCart = self.ShoppingCart();

            var orderSave = new PurchaseSave(tempUserId, tempCartPrice, tempAddress, tempCart);
            var myData = ko.toJSON(orderSave);
            console.log(myData);

            $.ajax({
                type: "POST",
                async: false,
                url: '/Products/AddOrder',
                contentType: "application/json", // Thank you Stackoverflow!!!
                dataType: "json",
                traditional: true,
                data: myData,
                error: function (xhr, textStatus, errorThrown) {
                    console.log(xhr.responseText);
                    console.log("Inside the error method");

                },
                success: function (data) {
                    console.log("Inside the success method");

                }
            });
        }

您是否在JavaScript请求中将内容类型设置为
application/json
?是否可以包含完整的JavaScript请求?使用您的数据构建名为
order
的JavaScript对象,并在发布时使用
json.stringify
。除非您使用的是vNext,这是错误的
System.Web.Mvc.HttpPost
它应该来自
Http
名称空间,我相信不是
Mvc
名称空间。其次,这与您的JavaScript有关。
contentType
在JavaScript中。
[FromBody]
可能不是必需的。@AmitKumarGhosh不,
[FromBody]
肯定是必需的。默认情况下,WebApicController实例在URL中查找参数。如果您使用的是JSON字符串并发布该字符串,那么它必须查看请求正文。对于WebApi,您应该使用此属性
[System.Web.Http.HttpPost]
@savendraekanayake看起来您与Anton同时键入此响应&在他键入响应11分钟后才提交此响应。。。但基本上是一样的,至少你有一个链接。缺少有关内容类型的部分。。但是OP没有发布他的JavaScript也没用——如果他发布了,我相信你会发现的wink:这不是answar,也不是答案。
var self=this
是一个常见的问题,让我们知道你指的是什么
this
,因为当你在里面时,它可能会改变,比如说
error:function(){}
self.makePurchase = function () {
            var tempUserId = self.orderUserId();
            var tempCartPrice = self.ShoppingCartPrice();
            var tempAddress = self.orderAddress();
            var tempCart = self.ShoppingCart();

            var orderSave = new PurchaseSave(tempUserId, tempCartPrice, tempAddress, tempCart);
            var myData = ko.toJSON(orderSave);
            console.log(myData);

            $.ajax({
                type: "POST",
                async: false,
                url: '/Products/AddOrder',
                contentType: "application/json", // Thank you Stackoverflow!!!
                dataType: "json",
                traditional: true,
                data: myData,
                error: function (xhr, textStatus, errorThrown) {
                    console.log(xhr.responseText);
                    console.log("Inside the error method");

                },
                success: function (data) {
                    console.log("Inside the success method");

                }
            });
        }