asp.net mvc / web api 2 - 控制器接受一组JSON对象

时间:2015-06-24 17:29:36

标签: c# json asp.net-mvc asp.net-web-api2

我已经在这个问题上待了一整天了,我在帖子后阅读了帖子,但我仍然被卡住了。我正在尝试为我们的网络部门开发内部网服务目录。我希望能够将一组JSON对象发送到服务器,每个对象都是订单中的一个项目。我很乐意使用MVC或Web API控制器。到目前为止,它主要是一个MVC项目。

我的ajax电话:

reset()

我正在生成的JSON请求(来自Fiddler)

$.ajax({
        url: url,
        async: true,
        type: "POST",
        data: JSON.stringify({ "OrderItems": OrderItems }),
        dataType:'json',
        contentType: "application/json",
        error: function (jqXHR, textStatus, errorThrown) {
        },
        success: function (data, textStatus, jqXHR) {
            console.log("order sent!");
        }
    });

Order类:

{
    "OrderItems": [
        {
            "Manufacturer": "Cisco",
            "PartNumber": "WS-C3650-24PS-S",
            "Description": "Cisco Catalyst 3650 24 Port PoE 4x1G Uplink IP Base",
            "Price": "3510.00",
            "Quantity": 1,
            "TotalPrice": "3510.00"
        },
        {
            "Manufacturer": "Cisco",
            "PartNumber": "WS-C3650-48PS-S",
            "Description": "Cisco Catalyst 3650 48 Port PoE 4x1G Uplink IP Base",
            "Price": "5500.00",
            "Quantity": 1,
            "TotalPrice": "5500.00"
        }
    ]
}

OrderItem类:

  public class Order
    {
        public int ID { get; set; }
        public List<OrderItem> OrderItems { get; set; }

    }

我尝试构建MVC和Web Api 2控制器以在数据库中获取此信息。我的MVC控制器总是将ObjectItem JSON视为null,而Web Api 2 Controller无法将数组转换为列表。我的大脑现在坏了。

如果有人能告诉我创建控制器的方法我正在寻找我会非常感激。

修改

目前我正在使用自动生成的Web API 2控制器

 public class OrderItem
    {
        public int ID { get; set; }
        public string Manufacturer { get; set; }
        public string PartNumber { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
        public int Quantity { get; set; }
        public decimal TotalPrice { get; set; }

    }

编辑2

这是一个MVC控制器,基于Immersive的提示,如下所示。我构建了一些JSON响应,所以我可以尝试看看发生了什么。 ModelState无效,因此我返回最后一个返回响应,它显示一个空数组。这与我尝试过的任何MVC控制器基本上都是一样的问题:它们都没有对JSON数据进行任何操作。

编辑3

基于Immersive的提示,我有一个API控制器的小动作。这个解决了它无法反序列化数组的错误,因为它需要一个JSON数组......我不知道为什么我的数据不合格。

// POST api/Order
        [ResponseType(typeof(Order))]
        public IHttpActionResult PostOrder(Order order)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.Orders.Add(order);
            db.SaveChanges();

            return CreatedAtRoute("DefaultApi", new { id = order.ID }, order);
        }

编辑4

这是一个基于Thufir输入的MVC控制器,但模型状态始终显示无效。我的JSON在JSONlint检出。我使用'漂亮'版本JSONlint验证了上面的例子。

[ResponseType(typeof(Order))]
    public IHttpActionResult PostOrder(List<OrderItem>orderitems)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        Order order = new Order();
        order.OrderItems = orderitems;
        db.Orders.Add(order);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = order.ID }, order);
    }

2 个答案:

答案 0 :(得分:2)

首先,我会在这里检查你的JSON是否有效:http://jsonlint.com/

其次,尝试替换此行:

public ActionResult Create([Bind(Include="ID")] List<OrderItem>OrderItems)

用这个:

public ActionResult Create(Order model)

更新1:您应该检查您的JSON.Stringify实际输出的内容,我不清楚如何将该对象放在一起,因此可能值得检查。我有预感,这里的大部分问题都在JavaScript中。

更新2:通常在使用JSON.Stringify之前我创建我的对象(用循环或其他东西填充数组):

var myObject = {
    myName: 'Big Bob',
    myItems: someArrayHere
}

然后在我的AJAX调用中写下这个:

data: JSON.Stringify(myObject)

以下是我喜欢将对象组合在一起并对其进行字符串化的方法:

http://jsfiddle.net/4q2gx15c/

答案 1 :(得分:1)

以下是如何使用您的输入数据作为ApiController执行此操作,如果需要,您应该能够转换为视图。

保持您的数据类,将Action更改为OrderItem数组

public class OrderController : ApiController
{
    public Order PostOrder([FromBody] OrderItem[] orderitems)
    {
        if (orderitems != null)
        {
            Order order = new Order();
            order.OrderItems = orderitems.ToList<OrderItem>();

            return order;
        }
        return null;
    }
}

不确定为什么要回显数据但将其转换为列表会将其发回。

提琴手请求:

POST http://localhost:64719/api/Order HTTP/1.1 User-Agent: Fiddler Content-Type: application/json Host: localhost:64719 Content-Length: 615

[   {
    "ID": 1,
    "Manufacturer": "sample string 2",
    "PartNumber": "sample string 3",
    "Description": "sample string 4",
    "Price": 5.0,
    "Quantity": 6,
    "TotalPrice": 7.0   },   {
    "ID": 1,
    "Manufacturer": "sample string 2",
    "PartNumber": "sample string 3",
    "Description": "sample string 4",
    "Price": 5.0,
    "Quantity": 6,
    "TotalPrice": 7.0   },   {
    "ID": 1,
    "Manufacturer": "sample string 2",
    "PartNumber": "sample string 3",
    "Description": "sample string 4",
    "Price": 5.0,
    "Quantity": 6,
    "TotalPrice": 7.0   } ]

提琴手回应:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcV29ya1xFSVAgV29ya1xRdWVzdGlvbnNcU2FtcGxlTVZDXFNhbXBsZU1WQ1xhcGlcT3JkZXI=?=
X-Powered-By: ASP.NET
Date: Wed, 24 Jun 2015 20:09:38 GMT
Content-Length: 464

{"ID":0,"OrderItems":[{"ID":1,"Manufacturer":"sample string 2","PartNumber":"sample string 3","Description":"sample string 4","Price":5.0,"Quantity":6,"TotalPrice":7.0},{"ID":1,"Manufacturer":"sample string 2","PartNumber":"sample string 3","Description":"sample string 4","Price":5.0,"Quantity":6,"TotalPrice":7.0},{"ID":1,"Manufacturer":"sample string 2","PartNumber":"sample string 3","Description":"sample string 4","Price":5.0,"Quantity":6,"TotalPrice":7.0}]}

更新1

我没有ajax设置和安装,但这是我的java脚本。我认为您需要删除JSON.stringify调用周围的字符串以仅传递ogject。

    var TestXmlhttp = new XMLHttpRequest();

    TestXmlhttp.open("POST", "http://localhost:64719/api/Order", true);
    TestXmlhttp.setRequestHeader("Content-Type", "application/json");

    TestXmlhttp.onreadystatechange = function () {
        if (TestXmlhttp != null) {
            if (TestXmlhttp.readyState == 4) {
                try {
                    alert("Good");
                }
                catch (e) {
                    alert("Bad");
                }
            }
            else {
            }
        }
    }
    TestXmlhttp.send(JSON.stringify(OrderItems));