web-dev-qa-db-ja.com

Web APIバックエンドC#でJSONデータを受信する方法は?

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; }
    }

そして私のWebAPIメソッド:

[System.Web.Mvc.HttpPost]
        public bool AddOrder(PurchaseOrder order)
        {
            // Here I will do something

            return true;
        } 

「PurchaseOrder order」オブジェクトの結果として「null」のみを取得します。問題は、[System.Web.Mvc.HttpPost]を使用していることですか? [System.Web.Http.HttpPost]も試しましたが、同じ結果が得られます。 //マーティン

27
Martin Nilsson

Content-Typeリクエストの"application/json"

リクエストの本文にjsonを投稿する場合、メソッドシグネチャを

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

問題は解決しましたが、「application/json」が欠落していました。同じ問題を抱えている他の人のために、ここに私の機能があります。私はKnockout.jsを使用しているため、 "self" -Wordです。

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");

                }
            });
        }
6
Martin Nilsson

実装をこれに変更します。

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

}

詳細については、 http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

1